谁阻止我的线程?

时间:2010-09-01 16:29:23

标签: python multithreading

我有一些线程在队列中捕获作业,如下所示:

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>

5 个答案:

答案 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