在python中清空multiprocessing.queue(-1)的首选方法

phi*_*686 7 python queue multiprocessing multiprocess python-multiprocessing

我想拉出当前队列中的所有项目.还有另一个线程不断地将项目放在另一端,每个时期我想要获取当前队列中的所有项目.

有什么理由可以选择:

res = []
while q.qsize > 0 :
    res.append(q.get())
Run Code Online (Sandbox Code Playgroud)

要么

res = []
while True :
    try :
         res.append(q.get(block=False)) 
    except Queue.Empty :
         break
Run Code Online (Sandbox Code Playgroud)

现在文档明确指出qsize()> 0不会阻止队列在get上阻塞,但只有在多个线程可以从输出获取的情况下才是这样吗?

队列.qsize()返回队列的大致大小.注意,qsize()> 0不保证后续的get()不会阻塞,qsize()<maxsize也不保证put()不会阻塞.

这是否意味着第二种形式应该始终是首选?EAFP和所有这些?另外,调用q.qsize()有任何成本吗?是否会阻塞队列的另一端以便计算?

我想我已经谈过使用第二种形式,但对我来说似乎不那么干净.

Phi*_*lip 6

是的,您应该始终使用第二种变体:API的文档(应该)通常比未实现的实现细节更可靠.即使当前的multiprocessing实现工作如此,在你的特殊情况下,get()如果不能阻止qsize() > 0,它不能保证它将在未来版本的Python中保持这种方式,因为文档已经明确指出它不是.

话虽这么说,使用当前版本的Python,第一个版本应该可靠,只要你只有一个消费过程.在Linux和Windows 上调用qsize 内心调用sem_getvalueWaitForSingleObjectEx ; 两者都没有锁定任何东西.(对于Linux调用,这在联机帮助页中有记录,对于Windows调用,这是一个强有力的猜测.)

请注意,如果您有多个使用者并且想要确保其中一个使用者读取整个队列,则必须使用包含循环的附加锁!