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

Preferred way to empty multiprocessing.queue(-1) in python

我想提取当前队列中的所有项目。还有一个线程不断的在另一端放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 实现在您的特殊情况下工作,get() 不会在 qsize() > 0 时阻塞,也不能保证它在 [= 的未来版本中会保持这种方式23=],因为文档已经明确说明它不是。

也就是说,对于 Python 的当前版本,只要您只有一个消费进程,第一个版本应该可以可靠地工作。调用 qsize intenally invokes sem_getvalue on Linux and WaitForSingleObjectEx on Windows;两者都不锁定任何东西。 (对于 Linux 调用,这在联机帮助页中有记录,对于 Windows 调用,这是一个强有力的猜测。)

请注意,如果您有多个消费者并希望确保其中之一读取整个队列,则必须使用额外的锁来封闭您的循环!