【问题标题】:Preferred way to empty multiprocessing.queue(-1) in python在 python 中清空 multiprocessing.queue(-1) 的首选方法
【发布时间】:2016-08-31 01:22:15
【问题描述】:

我想提取当前队列中的所有项目。另一端有另外一个线程不断的往里面放物品,每一个周期我都想获取当前队列中的所有物品。

有什么理由更喜欢:

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()

这是否意味着应始终首选第二种形式? EAFP 和所有这些?另外,调用 q.qsize() 是否有任何费用?它会阻塞队列的另一端以便计数吗?

我想我已经说服自己使用第二种形式,但对我来说似乎不太干净。

【问题讨论】:

    标签: python queue multiprocessing python-multiprocessing multiprocess


    【解决方案1】:

    是的,您应该始终使用第二种变体:API 文档(应该)通常比未记录的实现细节更可靠。即使当前的multiprocessing 实现在你的特殊情况下工作,get() 不会阻塞如果qsize() > 0,也不能保证它在未来的 Python 版本中会保持这种方式,因为文档已经明确指出事实并非如此。

    话虽如此,对于当前版本的 Python,只要您只有一个消费进程,第一个版本应该可以可靠地工作。致电qsizeintenally invokes sem_getvalue on Linux and WaitForSingleObjectEx on Windows;两者都不锁定任何东西。 (对于 Linux 调用,这在手册页中有记录,对于 Windows 调用,这是一个强烈的猜测。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2014-12-23
      • 2012-08-25
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      相关资源
      最近更新 更多