下面的代码产生 100 个线程并随机生成一个异常。即使所有线程都执行完毕(同时产生了一些异常),主程序仍然没有退出。难道我做错了什么?需要修改什么才能让其中一个线程发生异常,主线程仍然退出?from __future__ import print_functionfrom threading import Threadimport sysimport randomfrom queue import Queue__author__ = 'aanush'"""Testing if threading exits the python script gracefully"""class NoException(Exception): passclass ThreadFail(Thread): """ Class which helps us in doing multi-threading which improves performance of the script """ def __init__(self, name, counter, queue_): Thread.__init__(self) self.queue = queue_ self.threadID = counter self.name = name self.counter = counter def run(self): while True: # Expand the tuple from queue and pass it to the target function some_random_num = self.queue.get() func_test(some_random_num) self.queue.task_done()def func_test(random_num): if random_num <= 10: print("Sleep time - {} greater than 10. Not raising exception".format(random_num)) else: print('sleep time less than 10 : Raising exception') raise NoExceptionqueue = Queue()for thread_num in range(100): worker = ThreadFail('Thread-{}'.format(thread_num), thread_num, queue) worker.daemon = True worker.start()for x in range(1000): queue.put(random.randrange(1, 15))queue.join()
1 回答
开满天机
TA贡献1786条经验 获得超13个赞
您在这里遇到了僵局。由于异常而终止的线程不会释放对共享资源的持有锁,因此queue会被破坏。您需要捕获线程内的异常并让它们优雅地退出。
def run(self):
while True:
# Expand the tuple from queue and pass it to the target function
some_random_num = self.queue.get()
try:
func_test(some_random_num)
except NoException:
pass
finally:
self.queue.task_done()
添加回答
举报
0/150
提交
取消