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

2024-04-19 11:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码生成100个线程并随机生成一个异常。即使所有线程都已执行完毕(有些线程正在生成异常),主程序仍不会退出。我做错什么了吗?需要修改什么,以便在其中一个线程中发生异常时,主线程仍然存在?你知道吗

from __future__ import print_function
from threading import Thread
import sys
import random
from queue import Queue


__author__ = 'aanush'

"""
Testing if threading exits the python script gracefully
"""


class NoException(Exception):
    pass


class 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 NoException


queue = 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()

Tags: thenameinfromimportselfqueuedef
1条回答
网友
1楼 · 发布于 2024-04-19 11:27:26

你在这里遇到了僵局。由于异常而终止的线程不会释放共享资源上的保留锁, 因此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()

相关问题 更多 >