直从Python docs:Python的多处理队列可靠性,队列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
?
这样的方法可以被认为是正确的,或者可能是回调方法(通过儿童之间的共享管道端点)更合适吗?
是的,我几乎在我的服务器中使用相同的方法。如果'compute'得到'None',它会将'active'变为'False'。但是,正如你在我的案例中所看到的,我有两个队列需要等待 - “独占”和“普通”队列的想法是“如果排他是空的,从一般来说”,但是,因为我希望能够停止即使在通用队列中有条目,我也会处理这些'None'。 – dmg