Ev.*_*nis 6 python queue multiprocessing python-3.x
有没有更好的方法来写下面的习语:
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
Run Code Online (Sandbox Code Playgroud)
qmultiprocessing.Queue()虽然我认为上面的结构也可以在其他地方找到,但是是一个相关的实例.
我觉得必须有一个更好的方法来做到这一点..
默认情况下,如果您使用,.get(..)您将有一个阻塞队列。事实上,如果我们查看文档:
Run Code Online (Sandbox Code Playgroud) 从队列中删除并返回一个项目。如果可选参数get([block[, timeout]])block是True(默认)并且Timeout是None(默认),则在必要时进行阻止,直到有可用的项目为止。如果 timeout 是正数,则它最多会阻塞 timeout 秒,并且如果在该时间内没有可用的项目,则会引发 Queue.Empty 异常。否则 (blockisFalse),如果一项立即可用,则返回一项,否则引发队列。空异常(在这种情况下超时被忽略)。
所以您可以安全地使用:
while True:
data = q.get()
# ... process data
Run Code Online (Sandbox Code Playgroud)
所以不需要进行“轮询”。简单的.get(..)通常会休眠,直到系统通知数据可用(尽管这可能取决于操作系统等)。