我想拉当前队列中的所有项目。还有另一个线程不断地将项目放在另一端,并且每个周期我都想获取当前在队列中的所有项目。

有什么理由更喜欢:

res = []
while q.qsize > 0 :
    res.append(q.get())

或者
res = []
while True :
    try :
         res.append(q.get(block=False))
    except Queue.Empty :
         break

现在,文档专门说qsize()> 0不会阻止队列在get上阻塞,但是仅在可以从输出中获取多个线程的情况下才是真的吗?



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

我想我已经说服自己使用第二种形式,但对我来说似乎不太干净。

最佳答案

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

话虽这么说,但在当前版本的Python中,只要您只有一个使用过程,第一个版本就应该可以可靠运行。调用qsize intenally invokes sem_getvalue on Linux and WaitForSingleObjectEx on Windows;两者都不锁任何东西。 (对于Linux调用,这在手册页中有记录,对于Windows调用,这是一个很强的猜测。)

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

09-26 06:59