等待流程成语

时间:2018-01-11 12:45:32

标签: python python-3.x queue multiprocessing

有没有更好的方法来编写以下习语:

while q.empty():      # wait until data arrives.
    time.sleep(5)  
while not q.empty():  # start consuming data until there is nothing left.
    data = q.get()    # this removes an item from the queue (works like `.pop()`)
    # do stuff with data

qmultiprocessing.Queue()的一个实例,如果相关,我认为上述结构也可以在其他地方找到。

我觉得必须有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:3)

默认情况下,如果您使用.get(..),则会有阻止队列。确实,如果我们看一下documentation

get([block[, timeout]])
从队列中删除并返回一个项目。如果可选参数blockTrue(默认值)TimeoutNone(默认值),则在必要时阻止项目可用。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Queue.Empty异常。 否则(blockFalse,如果一个项目立即可用,则返回一个项目,否则提升队列。空异常(在这种情况下忽略超时)。

所以你可以安全地使用:

while True:
    data = q.get()
    # ... process data

所以不需要“民意调查”。一个简单的.get(..)通常会睡眠,直到系统通知数据可用(尽管这可能取决于操作系统的方式。