Python多处理队列可靠性,队列vs SimpleQueue vs JoinableQueue
直接从Python开始: 类多处理。队列([maxsize]) qsize() 返回队列的大致大小。由于多线程/多处理语义,此数字不可靠 空的() 如果队列为空,则返回True,否则返回False。由于多线程/多处理语义,这是不可靠的 根据经验,我发现这对于Python多处理队列可靠性,队列vs SimpleQueue vs JoinableQueue,python,process,multiprocessing,Python,Process,Multiprocessing,直接从Python开始: 类多处理。队列([maxsize]) qsize() 返回队列的大致大小。由于多线程/多处理语义,此数字不可靠 空的() 如果队列为空,则返回True,否则返回False。由于多线程/多处理语义,这是不可靠的 根据经验,我发现这对于队列,尤其是empty() 在我的代码中,我有一组进程(每个进程都是同一主进程的子进程),每个进程的run方法中都有以下内容: while self.active: if(self.exclusive_queue.empty() a
队列
,尤其是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)
基本上,进程在常规队列
上等待工作,但首先检查其独占队列
。主进程可以将任务放入进程的常规队列或独占队列中。现在,在if(self.exclusive\u queue.empty()和self.exclusive\u queue.qsize()==0)
中,我首先使用了self.exclusive\u queue.empty()
,这导致了相当奇怪的行为(qsize()
为30+和empty()=True
)
因此,我要说的是-对于文档中的多处理.queues.SimpleQueue
:
空的()
如果队列为空,则返回True,否则返回False
根本没有提到可靠性。SimpleQueue.empty()可靠吗
第二种是多处理。JoinableQueue
可靠还是比Queue
更可靠,因为task_done()
机制
这样的方法可以被认为是正确的吗?或者使用回调(通过子级之间的共享管道端点)的方法更合适吗?这不是一个直接的答案,但我已经开始越来越依赖于使用保护条件迭代输入队列。多处理模块的文档中有一个示例:
def worker(input, output):
for func, args in iter(input.get, 'STOP'):
result = calculate(func, args)
output.put(result)
因此,当您对队列的输入完成后,您只需将尽可能多的STOP
字符串,或您选择的任何保护,放入队列,就像您启动进程一样。是的,我在服务器中使用的方法基本相同。如果compute
得到一个None
值,它将active
变为False
。然而,正如你在我的例子中所看到的,我有两个队列要等待——“独占”和“通用”队列,其思想是“如果独占为空,则从通用获取”,因为我希望即使在常规队列中有条目也能停止进程,所以我将None
s放在排他队列中。在我的情况下SimpleQueue
只能存储太少的元素[roughly 360(int,str,int)-元组)
]。出于这个原因,我决定对队列使用STOP
元素(如middnighter
s答案中所述)。对于队列,即使在相同结构的100000个元素之后,我也没有达到大小限制。