Python多处理“Queue”对象没有“task\u done”/“join”属性

2024-05-05 19:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个线程进程重写为一个多进程队列,以尝试加快大型计算的速度。我已经得到了95%的结果,但是我不知道如何使用multiprocessingQueue为空时发出信号。


我的原始代码是这样的:

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不是multiprocessingQueue类的一部分,但不清楚我应该使用什么。

"They differ in that Queue lacks the task_done() and join() methods introduced into Python 2.5’s Queue.Queue class." Source

但是如果没有这两种方法,我不确定队列是如何知道它已经完成的,以及如何继续使用程序。


Tags: runinimporttruefor队列queuefetch