我正在使用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()
答案 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
例外。