当工作程序崩溃时,线程队列挂起

时间:2016-04-06 01:33:54

标签: python multithreading queue

我正在使用Python Queue with Thread。我注意到当一个工人崩溃时,脚本挂起并且不允许我终止。以下是一个例子:

from Queue import Queue
from threading import Thread

num_worker_threads = 2

def worker():
        while True:
                item = q.get() 
                1/item
                q.task_done()
q = Queue()
for i in range(num_worker_threads):
        t = Thread(target=worker)
        t.daemon = True
        t.start()

q.put(0)
q.join()

3 个答案:

答案 0 :(得分:1)

我通过将作业包装在异常中来修复此问题。我原本以为当一个工人崩溃时,脚本就会退出。不是这种情况。看起来q.task_done()永远不会被调用所以它挂在q.join()上。

解决方案:

from Queue import Queue
from threading import Thread

num_worker_threads = 2

def worker():
        while True:
                item = q.get()
                try:
                        1/item
                except Exception as e:
                        print e
                finally:
                        q.task_done()
q = Queue()
for i in range(num_worker_threads):
        t = Thread(target=worker)
        t.daemon = True
        t.start()

q.put(0)
q.join()

添加了rsy的建议。

答案 1 :(得分:1)

更简洁的方法是在finally块中使用task_done()。

from Queue import Queue
from threading import Thread

num_worker_threads = 2

def worker():
        while True:
                item = q.get()
                try:
                        1/item
                except Exception as e:
                        print e
                finally: 
                      q.task_done()
q = Queue()
for i in range(num_worker_threads):
        t = Thread(target=worker)
        t.daemon = True
        t.start()

q.put(0)
q.join()

答案 2 :(得分:0)

您正在调用while True,它在您的帖子中使用Queue不断尝试从q.get()获取元素,但队列中可能没有任何项目。这将导致Empty异常,因为队列中没有任何内容可以实际获取。

你的循环应该是while not q.empty():,否则你应该抓住Queue.Empty例外。