Python线程退出代码

16 投票
3 回答
14548 浏览
提问于 2025-04-15 12:12

有没有办法判断一个线程是正常结束的,还是因为出现了异常而结束的呢?

3 个回答

0

让你的线程函数能够捕捉异常。你可以用一个简单的包装函数来实现,这个函数在一个try...except或者try...except...else的结构里调用原来的线程函数。这样一来,问题就变成了“如何在一个线程和另一个线程之间传递信息”,我想你应该已经知道怎么做了。

0

你可以设置一个全局变量,如果成功就设为0,如果出现异常就设为非零值。这是一种很常见的做法。

不过,你需要用互斥锁(mutex)或信号量(semaphore)来保护这个变量。或者你也可以确保只有一个线程会写这个变量,其他线程只负责读取它。

21

如前所述,可以在Thread类外面加一个“包装器”,这样就能捕捉到那个状态。下面是一个例子。

>>> from threading import Thread
>>> class MyThread(Thread):
    def run(self):
        try:
            Thread.run(self)
        except Exception as err:
            self.err = err
            pass # or raise err
        else:
            self.err = None


>>> mt = MyThread(target=divmod, args=(3, 2))
>>> mt.start()
>>> mt.join()
>>> mt.err
>>> mt = MyThread(target=divmod, args=(3, 0))
>>> mt.start()
>>> mt.join()
>>> mt.err
ZeroDivisionError('integer division or modulo by zero',)

撰写回答