我想拉当前队列中的所有项目。还有另一个线程不断地将项目放在另一端,并且每个周期我都想获取当前在队列中的所有项目。
有什么理由更喜欢:
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调用,这是一个很强的猜测。)
请注意,如果您有多个使用者,并且要确保其中一个使用者读取整个队列,则必须使用附加的锁来封闭循环!