我有以下线程,大部分时间队列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()的阻塞功能,这看起来很难看。好像我在这里错过了这个问题的优雅解决方案?是否有一个或者我应该使用繁忙的等待解决方案?
答案 0 :(得分:0)
不要使用exit_flag
标志,而是考虑在队列中放置一个特殊的“关闭”指示符。当工作人员将关闭指示符出列时,让它识别关闭指示符并关闭而不是继续。
答案 1 :(得分:0)
没有第三方依赖关系的一种方法是使用消费者/生产者模式,您可以在其自己的线程中运行代码,因此它不会阻塞。