【问题标题】:Use get_nowait() in python without raising empty exception在 python 中使用 get_nowait() 而不引发空异常
【发布时间】:2016-08-26 15:54:58
【问题描述】:

我有一个进程间队列,该队列通常是空的,并且偶尔会出现一些内容。在我的一个线程中,我想定义一个这样的 while 循环:

def mythread(queue1):

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

在队列为空之前效果很好,这在我的情况下很快发生。当队列为空时,调用 get_nowait() 或 get(False) 会引发空队列异常。有什么方法可以在不阻塞且不引发空异常的情况下检查队列?

【问题讨论】:

  • 如果你不想阻塞,那么当你在一个空队列上调用它时就会发生一些事情。捕获异常并处理它。

标签: multithreading python-2.7 queue interprocess


【解决方案1】:

使用empty方法

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

注意:医生说“不可靠”(不开玩笑)。

我想这是因为它可以在发布消息时返回True(队列为空),因此该操作不像捕获异常那样原子。好吧,接下来是get_nowait() 调用,我想这没关系,除非其他线程也可以使用队列,在这种情况下,可能会发生竞争情况,并且当您尝试从中读取时队列可能为空!

【讨论】:

  • 好主意,看起来我需要在我想要的循环之上再添加一个 while 循环
  • 白白使用pass?那么,为什么不if not queue1.empty(): ...
  • 这是一个“积极的”分支模式,体现了当队列为空时我们什么都不做的事实。但是,是的,您可以使用not queue1.empty()
猜你喜欢
  • 2017-10-16
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多