使用queue.get()进行Python阻塞,无异常或忙等待

时间:2017-06-16 20:27:43

标签: python python-2.7 exception blockingqueue 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()的阻塞功能,这看起来很难看。好像我在这里错过了这个问题的优雅解决方案?是否有一个或者我应该使用繁忙的等待解决方案?

2 个答案:

答案 0 :(得分:0)

不要使用exit_flag标志,而是考虑在队列中放置一个特殊的“关闭”指示符。当工作人员将关闭指示符出列时,让它识别关闭指示符并关闭而不是继续。

答案 1 :(得分:0)

没有第三方依赖关系的一种方法是使用消费者/生产者模式,您可以在其自己的线程中运行代码,因此它不会阻塞。