我想拉出当前队列中的所有项目。还有一个线程不断的在另一端放item,每期我都想获取当前队列中的所有item。
有什么理由更喜欢:
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 上阻塞,但这是否仅在多个线程可以从输出中获取的情况下才正确?
Queue.qsize() Return the approximate size of the queue. Note, qsize() > 0 doesn’t guarantee that a subsequent get() will not block, nor will qsize() < maxsize guarantee that put() will not block.
这是否意味着应该始终首选第二种形式? EAFP 等等?另外,调用 q.qsize() 有任何成本吗?它会阻塞队列的另一端以便计数吗?
我想我已经说服自己使用第二种形式,但对我来说它似乎不太干净。
最佳答案
是的,您应该始终使用第二种变体:API 文档通常(应该)比未记录的实现细节更可靠。即使当前的 multiprocessing
实现在您的特殊情况下工作,如果 qsize() > 0
,get()
也不会阻塞,它不能保证它会在未来的 Python 版本中保持这种方式,因为文档已经明确指出它不是。
也就是说,对于当前版本的 Python,第一个版本应该可以可靠地工作,只要您只有一个消费进程。调用 qsize
intenally invokes sem_getvalue
on Linux and WaitForSingleObjectEx
on Windows ;两者都不锁定任何东西。 (对于 Linux 调用,这在联机帮助页中有记录,对于 Windows 调用,这是一个很强的猜测。)
请注意,如果您有多个消费者并希望确保其中之一读取整个队列,则必须使用额外的锁来封闭您的循环!
关于python - 在 python 中清空 multiprocessing.queue(-1) 的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37047476/