为了账号安全,请及时绑定邮箱和手机立即绑定

当其中一个线程中存在未捕获的异常时,Python 多线程程序不会退出

当其中一个线程中存在未捕获的异常时,Python 多线程程序不会退出

繁星淼淼 2021-06-29 13:08:39
下面的代码产生 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()


查看完整回答
反对 回复 2021-07-27
  • 1 回答
  • 0 关注
  • 365 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信