Python多处理 - '队列'对象没有属性' task_done' /'加入'

时间:2016-04-06 19:01:11

标签: python multithreading python-2.7 multiprocessing

我正在将一个线程进程重写到多处理队列中,以尝试加速大型计算。我已经95%的方式获得了它,但我无法弄清楚Queue在使用multiprocessing时为空的信号。

我的原始代码是这样的:

import Queue
from threading import Thread

num_fetch_threads = 4
enclosure_queue = Queue()

for i in range(num_fetch_threads):
  worker = Thread(target=run_experiment, args=(i, enclosure_queue))
  worker.setDaemon(True)
  worker.start()

for experiment in experiment_collection:
  enclosure_queue.put((experiment, otherVar))

enclosure_queue.join()

队列的功能如下:

def run_experiment(i, q):
  while True:
    ... do stuff ...
    q.task_done()

我的新代码是这样的事情:

from multiprocessing import Process, Queue

num_fetch_threads = 4
enclosure_queue = Queue()

for i in range(num_fetch_threads):
  worker = Process(target=run_experiment, args=(i, enclosure_queue))
  worker.daemon = True
  worker.start()

for experiment in experiment_collection:
  enclosure_queue.put((experiment, otherVar))

worker.join() ## I only put this here bc enclosure_queue.join() is not available

新队列功能:

def run_experiment(i, q):
  while True:
    ... do stuff ...
    ## not sure what should go here

我一直在阅读文档和Google,但无法弄清楚我缺少的内容 - 我知道task_done / join不属于multiprocessing { {1}}课程,但不清楚我应该使用什么。

  

"它们的不同之处在于Queue缺少task_done()和join()方法   介绍了Python 2.5的Queue.Queue类。" Source

但如果没有其中任何一个,我不确定队列是如何知道它已完成的,以及如何继续使用该程序。

1 个答案:

答案 0 :(得分:2)

考虑使用multiprocessing.Pool而不是手动管理员工。池处理将任务分派给工作人员,具有方便的功能,如map和apply,并支持.close.join方法。 Pool负责处理进程之间的队列并处理结果。以下是使用multiprocessing.Pool代码的代码:

from multiprocessing import Pool

def do_experiment(exp):
    # run the experiment `exp`, will be called by `p.map`
    return result

p = Pool() # automatically scales to the number of CPUs available

results = p.map(do_experiment, experiment_collection)
p.close()
p.join()