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

8
我希望能够获取当前队列中的所有项目。另一个线程不断将项目放在队列的另一端,而我想每隔一段时间获取当前队列中的所有项目。
有什么理由更喜欢以下方式吗:
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不能防止队列在获取时阻塞,但这只适用于多个线程可以从输出中获取的情况下。
队列.Queue.qsize() 返回大约队列的大小。请注意,qsize() > 0 不能保证随后的get()不会阻塞,而qsize() < maxsize也不能保证put()不会阻塞。
这是否意味着应始终首选第二种形式?EAFP等等? 另外,调用q.qsize() 是否有成本?它是否会阻塞队列的另一端以进行计数?
我猜我已经说服自己使用第二种形式,但它对我来说似乎不太干净。
1个回答

8
是的,你应该始终使用第二种方法:API的文档(应该)比实现的未经记录的细节更可靠。即使当前的multiprocessing实现在您的特殊情况下工作正常,如果qsize() > 0get()不会阻塞,但不能保证它将在Python的将来版本中保持这种状态,因为文档已经清楚地说明了这一点。
话虽如此,在当前版本的Python中,只要您只有一个消费进程,第一个版本也应该是可靠的。调用qsize会在Linux上内部调用sem_getvalue,在Windows上调用WaitForSingleObjectEx;两者都不会锁定任何东西。(对于Linux调用,这在手册中有记录,对于Windows调用,这是一个很强的猜测。)
请注意,如果您有多个消费者并且想确保其中一个读取整个队列,则必须使用额外的锁来包含您的循环!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接