Python 用 queue.get() 阻塞,没有异常或忙等待

Python blocking with queue.get() without exceptions or busy waiting

我有以下线程,队列 q 大部分时间是空的:

def run(self):

    while True:
        if not self.exit_flag:
            items = self.q.get()
            q.work_it()
        else:
            return 0

如果设置了退出标志,它不太可能立即退出,因为它可能当前阻塞在

items = self.q.get()

如果我设置超时

items = self.q.get(True, 0.1)

我经常会抛出 Empty 异常,因为队列经常是空的,使用的资源比我想要的多。

如果我忙着等

def run(self):

    while True:
        if not self.exit_flag:
            if not self.q.empty():
                items = self.q.get()
                q.work_it()
            time.sleep(0.1)
        else:
            return 0

然后我忙着等待,而不是使用看起来很难看的 Queue.get() 的阻塞功能。好像我在这里错过了这个问题的优雅解决方案?有没有一个或者我应该只使用繁忙的等待解决方案?

不使用 exit_flag 标志,而是考虑在队列中放置一个特殊的 "shutdown" 指标。当 worker 出列关闭指示器时,让它识别关闭指示器并关闭而不是继续。

一种没有第三方依赖性的方法是使用 consumer/producer 模式,其中您的代码 运行 在它自己的线程中,因此它不会阻塞。