在Python中使用get_nowait()而不会抛出空异常

4

我有一个跨进程的队列,通常是空的,只有偶尔会出现一些东西。在我的一个线程中,我想定义一个while循环,像这样:

def mythread(queue1):

    while (queue1.get_nowait() != 1):
        #do stuff

这个方法在队列非空的情况下运作得很好,但是在我的情况下队列很快就为空了。当队列为空时,调用get_nowait()或get(False)会引发空队列异常。是否有一种不会阻塞且不会引发空异常的方法来检查队列?


如果你不想阻塞,那么当你在空队列上调用时必须发生一些事情。捕获异常并处理它。 - mata
1个回答

8

使用 empty 方法

if queue1.empty():
   pass
else:
   # get items from the queue

注意:文档中说“不可靠”(不是开玩笑的)。
我想这是因为它可以返回True(队列为空),而消息已经被发布,所以操作不像捕获异常那么原子化。好吧,在调用get_nowait()之后,我想除非其他线程也能消耗队列,在这种情况下可能会发生竞争条件,并且在尝试从队列读取时队列可能为空!

好主意,看起来我需要在想要的while循环之上再加一个while循环。 - willpower2727
1
使用 pass 什么也不做?那为什么不用 if not queue1.empty(): ... 呢? - slayer
这是一种“正面”的分支模式,旨在实现当队列为空时不执行任何操作的事实。但是,您可以使用 not queue1.empty() - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接