2013-02-07 127 views
4

直从Python docsPython的多处理队列可靠性,队列VS SimpleQueue VS JoinableQueue

类multiprocessing.Queue([MAXSIZE])

...

QSIZE() 返回队列的近似大小。由于多线程/多处理语义,这个数字是不可靠的。

empty() 如果队列为空则返回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写到:

空() 返回真,如果队列为空,否则为false。

根本没有提到可靠性。 SimpleQueue.empty()是可靠的吗?

第二个是multiprocessing.JoinableQueue由于task_done()机制的可靠或“更”可靠比Queue

这样的方法可以被认为是正确的,或者可能是回调方法(通过儿童之间的共享管道端点)更合适吗?

回答

3

不是直接的答案,但我已经开始越来越多地依赖守护条件迭代输入队列。还有就是多模块的文档中的一个例子:

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

因此,当你输入队列完成后,您只需put许多STOP串,或任何守护你选择,到队列中,你已经开始过程。

+0

是的,我几乎在我的服务器中使用相同的方法。如果'compute'得到'None',它会将'active'变为'False'。但是,正如你在我的案例中所看到的,我有两个队列需要等待 - “独占”和“普通”队列的想法是“如果排他是空的,从一般来说”,但是,因为我希望能够停止即使在通用队列中有条目,我也会处理这些'None'。 – dmg