我有一些线程在队列中捕获作业,如下所示:
class Worker(Thread):
[...]
def run(self):
while not self.terminated:
job = myQueue.get_nowait()
job.dosomething()
sleep(0.5)
现在,self.terminated只是我用来退出循环的bool值,但是,这就是问题,一天中有几次他们在没有我干预的情况下停止工作。所有这些只有一个:应用程序开始,比方说,5个工作线程,随机时我检查它们,只有一个工作。所有其他人都有_Thread__initialized和_Thread__stopped字段为真。线程和作业不会相互影响。我应该寻找什么?
PS:我明白在没有实际代码的情况下尝试找出问题真的很难,但它很大。UPDATE:实际上Queue.Empty是被困的唯一例外 - 猜测我相信让所有作业的内部错误传播而不会杀死线程eheh - 所以我将阻止所有异常并看到...... < / p>
答案 0 :(得分:3)
如果这是实际代码,那很明显:myQueue.get_nowait()
在队列为空时引发异常(Empty
)!
答案 1 :(得分:2)
计算器? :)
答案 2 :(得分:2)
例如,循环内的异常将停止该线程。
为什么使用get_nowait()
而非get()
?如果队列是空的怎么办?
答案 3 :(得分:1)
我有两个建议。
1)如果没有可用的项目,get_nowait()将引发Queue.Empty
异常。确保异常不会杀死你的线程。
2)改用get()。在队列中放置None
以指示线程退出而不是布尔标志。那么你不需要半秒睡眠就可以更快地处理物品。
def run(self):
while True:
job = queue.get()
if job:
try:
job.do_something()
except Exception as e:
print e
else: # exit thread when job is None
break
答案 4 :(得分:0)
GIL?如果你想要真正的并行化,你只需要一名翻译工作就必须使用多处理,请参阅http://docs.python.org/library/multiprocessing.html