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