【问题标题】:Python multiprocessing start a number of workers and start others when one finishesPython 多处理启动许多工作人员并在一个完成时启动其他工作人员
【发布时间】:2017-02-22 02:44:10
【问题描述】:

所以我有类似的东西

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

谢谢 谢谢。

【问题讨论】:

标签: python multiprocessing


【解决方案1】:

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

【讨论】:

  • NameError: name 'do_something' is not defined
  • 您需要将上面的代码与您的代码集成。我会更新我的答案。
  • PicklingError: Can't pickle : 属性查找 builtin.instancemethod failed
  • do_something 定义为一个函数而不是一个类方法来解决这个问题。检查stackoverflow.com/questions/1816958/…我已经更新了我的答案
  • 看看我上一条评论中的链接。它将向您展示如何为酸洗准备实例方法。
【解决方案2】:

无需发明轮子。来自concurrent.futuresProcessPoolExecutor 正是您所需要的。

【讨论】:

    【解决方案3】:

    使用来自multiprocessingPool

    这里有一个简短的使用示例,可​​能适合您的目的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2015-01-20
      • 2023-02-08
      • 1970-01-01
      • 2013-06-17
      相关资源
      最近更新 更多