等待流程成语

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()虽然我认为上面的结构也可以在其他地方找到,但是是一个相关的实例.

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

Wil*_*sem 3

默认情况下,如果您使用,.get(..)您将有一个阻塞队列。事实上,如果我们查看文档

get([block[, timeout]])
Run Code Online (Sandbox Code Playgroud) 从队列中删除并返回一个项目。如果可选参数blockTrue(默认)并且TimeoutNone(默认),则在必要时进行阻止,直到有可用的项目为止。如果 timeout 是正数,则它最多会阻塞 timeout 秒,并且如果在该时间内没有可用的项目,则会引发 Queue.Empty 异常。否则 ( blockis False),如果一项立即可用,则返回一项,否则引发队列。空异常(在这种情况下超时被忽略)。

所以您可以安全地使用:

while True:
    data = q.get()
    # ... process data
Run Code Online (Sandbox Code Playgroud)

所以不需要进行“轮询”。简单的.get(..)通常会休眠,直到系统通知数据可用(尽管这可能取决于操作系统等)。