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

标签 python queue multiprocessing python-multiprocessing multiprocess

我想拉出当前队列中的所有项目。还有一个线程不断的在另一端放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() > 0get() 也不会阻塞,它不能保证它会在未来的 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/

相关文章:

python - 多处理,pool.ready 做什么?

python - .get() 之后多处理陷入困境

python - 如何让 IPython Notebook 运行 Python 3?

python - ssh 管道损坏时停止 python 程序

c++ - Mat队列中的访问冲突

python - 如何在列表长度达到一定限制后停止追加值?

python 多处理问题

python - 为什么当元素存在时, Selenium 会超时

Python:为 Ansible 编写 INI 文件

c - 为什么使用此代码中的 "LD_QUEUE_AVAILABLE"状态