直接来自Python docs:
class multiprocessing.Queue([maxsize])
...
QSIZE() 返回队列的大致大小。由于多线程/多处理语义,这个数字不可靠。
空() 如果队列为空,则返回True,否则返回False。由于多线程/多处理语义,这是不可靠的。
我根据经验发现Queue
非常适用,尤其是empty()
。
在我的代码中,我有一堆进程(每个进程都是同一主进程的子进程),并且每个进程在run
方法中都有以下内容:
while self.active:
if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0):
try:
self.exclusive_queue.put(self.general_queue.get(timeout=self.queue_timeout))
except Queue.Empty as empty_queue:
continue
else:
task = self.exclusive_queue.get()
self.compute(task)
基本上,该过程会等待general_queue
工作,但首先检查其exclusive_queue
。主进程可以将任务放在进程的常规队列或独占队列中。现在,在if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0)
中,我首先使用了self.exclusive_queue.empty()
,这导致了一种非常奇怪的行为(qsize()
为30+和empty() = True
。
所以,我正在解决这个问题 - 对于文档中的multiprocessing.queues.SimpleQueue
来说:
空() 如果队列为空,则返回True,否则返回False。
根本没有提到可靠性。 SimpleQueue.empty()可靠吗?
由于multiprocessing.JoinableQueue
机制,第二个Queue
可靠或比task_done()
“更可靠”?
这种方法是否可以被认为是正确的,或者回调的方法(通过子代之间的共享管道端点)更合适?
答案 0 :(得分:3)
不是一个直接的答案,但我已经开始越来越多地依赖于使用保护条件迭代输入队列。多处理模块的文档中有一个示例:
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = calculate(func, args)
output.put(result)
因此,当您对队列的输入完成后,您只需put
尽可能多STOP
个字符串,或者您选择的任何保护,就像您已启动进程一样。