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 模式,其中您的代码 运行 在它自己的线程中,因此它不会阻塞。
我有以下线程,队列 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 模式,其中您的代码 运行 在它自己的线程中,因此它不会阻塞。