在 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 调用,这是一个强有力的猜测。)
请注意,如果您有多个消费者并希望确保其中之一读取整个队列,则必须使用额外的锁来封闭您的循环!
我想提取当前队列中的所有项目。还有一个线程不断的在另一端放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 调用,这是一个强有力的猜测。)
请注意,如果您有多个消费者并希望确保其中之一读取整个队列,则必须使用额外的锁来封闭您的循环!