Python多处理队列可靠性,队列与SimpleQueue和JoinableQueue

时间:2013-02-07 15:12:38

标签: python process multiprocessing

直接来自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()“更可靠”?

这种方法是否可以被认为是正确的,或者回调的方法(通过子代之间的共享管道端点)更合适?

1 个答案:

答案 0 :(得分:3)

不是一个直接的答案,但我已经开始越来越多地依赖于使用保护条件迭代输入队列。多处理模块的文档中有一个示例:

def worker(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = calculate(func, args)
        output.put(result)

因此,当您对队列的输入完成后,您只需put尽可能多STOP个字符串,或者您选择的任何保护,就像您已启动进程一样。