我们说我有两个元素的队列。 我循环通过使用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()
答案 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:我知道这已经有几岁了,但仍然...