queue.empty并在空时执行put

时间:2015-12-02 13:37:06

标签: python queue

我们说我有两个元素的队列。 我循环通过使用get弹出项目的队列。一旦我弹出第二个元素,我担心循环会停止循环,我需要重新处理它,因为有些错误。所以我把它放回队列中,但它不会因为那时队列是空的。

我的循环:

while not queue.empty():
  try:
    item = queue.get()
    do stuff(item):
  except Exception as e:
    queue.put(item)
  queue.task_done()

我阅读了关于Queue.empty的文档,但对阻塞及其含义感到困惑; Queue.empty()

1 个答案:

答案 0 :(得分:0)

如果您正在使用多个线程(如我所愿)(为什么还要担心阻塞?),通常这样做不是一个好主意:

if not queue.empty():  # or 'while' instead of 'if'
    item = queue.get()

因为另一个线程可能已经清空了第一行和第二行之间的queue,所以您的queue.get()现在会阻塞,直到有新内容出现为止,如果您编写了它,这似乎不是预期的行为。基本上,if not queue.empty()在并发情况下毫无意义。

正确的方法是:

try:
    while True:
        item = queue.get(block=False)
        done = False
        while not done:
            try:
                do stuff(item)
                done = True
            except Exception as e:
                pass  # just try again to do stuff
        queue.task_done()
except Empty:
    pass  # no more items

除此之外(如果我们假设没有其他线程可以占用您的队列),则代码可以正常工作。我对您是否理解(或因为这个问题很久而“理解”)阻塞的概念有一些严重怀疑。  如果根据文档说明某个函数正在“阻塞”,那仅意味着那一刻将停止执行代码,直到发生某些事件为止。 time.sleep(1)可能是阻止功能持续1秒的最佳示例。

PS:我知道这已经有几岁了,但仍然...