有没有更好的方法来编写以下习语:
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
q
是multiprocessing.Queue()
的一个实例,如果相关,我认为上述结构也可以在其他地方找到。
我觉得必须有更好的方法来做到这一点。
答案 0 :(得分:3)
默认情况下,如果您使用.get(..)
,则会有阻止队列。确实,如果我们看一下documentation:
从队列中删除并返回一个项目。如果可选参数get([block[, timeout]])
block
为True
(默认值)且Timeout
为None
(默认值),则在必要时阻止项目可用。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Queue.Empty异常。 否则(block
为False
),如果一个项目立即可用,则返回一个项目,否则提升队列。空异常(在这种情况下忽略超时)。
所以你可以安全地使用:
while True:
data = q.get()
# ... process data
所以不需要“民意调查”。一个简单的.get(..)
通常会睡眠,直到系统通知数据可用(尽管这可能取决于操作系统的方式。