簡體   English   中英

Python多處理啟動了許多工作程序,並在一個工作完成后啟動其他工作程序

[英]Python multiprocessing start a number of workers and start others when one finishes

所以我有類似的東西

import multiprocessing

class MyFancyClass(object):

    def __init__(self, name):
    self.name = name

    def do_something(self):
    proc_name = multiprocessing.current_process().name
    print 'Doing something fancy in %s for %s!' % (proc_name, self.name)


def worker(q):
    obj = q.get()
    obj.do_something()


if __name__ == '__main__':
        urls = [
    'http://www.python.org',
    'http://www.python.org/about/',
    'http://www.python.org/community/awards/'
    # etc..
]

    queue = multiprocessing.Queue()

    p = multiprocessing.Process(target=worker, args=(queue,))
    p.start()

    queue.put(MyFancyClass('Fancy Dan'))

    # Wait for the worker to finish
    queue.close()
    queue.join_thread()
    p.join()

我想要做的是讓4個或更多“工人”啟動並處理網址,當一個完成時啟動另一個。 什么是做到這一點的最佳方法。 我花了兩天時間,無法解決。

謝謝謝謝。

使用並發

import concurrent.futures
import multiprocessing

def do_something(name):
    proc_name = multiprocessing.current_process().name
    print 'Doing something fancy in %s for %s!' % (proc_name, name)

class MyFancyClass(object):

    def __init__(self, name):
    self.name = name


MyFancy = MyFancyClass("Name")

if __name__ == '__main__':
    urls = [
        'http://www.python.org',
        'http://www.python.org/about/',
        'http://www.python.org/community/awards/'
        # etc..
]

with concurrent.futures.ProcessPoolExecutor() as executor:
    results = executor.map(do_something, urls)

有關詳細信息,請參見current.futures文檔

無需發明輪子。 ProcessPoolExecutorconcurrent.futures不正是你所需要的。

使用multiprocessing Pool

這是一個簡短的示例,它可能適合您的目的:

from multiprocessing import Pool

def f(x,y):
    print x*y

p = Pool(5)
for i in range(100):
    p.apply_async(f,(i,i+1))
p.close()
p.join()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM