直接引用自Python 文档:
class multiprocessing.Queue([maxsize])
...
qsize() 返回队列的大约大小。由于多线程/多进程语义,这个数字不可靠。
empty() 如果队列为空则返回True,否则返回False。由于多线程/多进程语义,这是不可靠的。
在我的代码中,我有一堆进程(每一个都是同一个主进程的子进程),每个进程的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
在文档中写道:
empty() 如果队列为空,则返回True,否则返回False。
没有提到其可靠性。 SimpleQueue.empty() 是否可靠?
另外,multiprocessing.JoinableQueue
是否可靠或比 Queue
更可靠,因为它具有 task_done()
机制?
这种方法是否可以被认为是正确的,或者通过子进程之间的共享管道端点进行回调的方法更合适?
SimpleQueue
只能存储很少的元素 [大约 360 个(int, str, int)-tuples)
]。因此,我决定使用一个STOP
元素(如Midnighter
的回答中所提到的)与 Queue 一起使用。对于 Queue,即使是相同结构的 100,000 个元素,我也没有遇到大小限制。 - Markus Dutschke