Python多处理启动了许多工作人员,并在完成后启动其他人员

时间:2017-02-21 14:38:42

标签: python multiprocessing

所以我有类似的东西

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个或更多“工人”启动并处理网址,当一个人完成另一个工作时。 什么是最好的方法来做到这一点。我花了两天时间来解决这个问题。

谢谢 谢谢。

3 个答案:

答案 0 :(得分:2)

使用concurrent.futures

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)

有关详细信息,请参阅concurrent.futures documentation

答案 1 :(得分:1)

无需发明轮子。来自concurrent.futuresProcessPoolExecutor完全符合您的需要。

答案 2 :(得分:0)

使用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()