Python 线程退出代码

15

有没有一种方法可以判断线程是正常退出还是因异常而退出?

3个回答

20

如之前所述,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',)

0
你可以将一些全局变量设置为0,如果成功的话,或者非零,如果出现异常。这是相当标准的惯例。
但是,您需要使用互斥锁或信号量来保护此变量。或者,您可以确保只有一个线程会写入它,而所有其他线程都只会读取它。

1
成功的返回值为0可能是一个相当标准的约定,但是使用布尔类型的succeded会不会对解释器更加友好一些呢? - Daren Thomas
如果我子类化Thread,它不必是全局的,只需要在其中有一个成员变量来指示成功即可。我只是想知道是否有任何内置的方法可以做到这一点,就像进程退出代码一样。 - Jiayao Yu
9
线程和全局状态。两种伟大的味道搭配在一起是绝妙的体验。段错误,核心已转储。 - Glyph
@Glyph 注意我提到了互斥锁和信号量。 - samoz

0

让您的线程函数捕获异常。(您可以使用一个简单的包装函数来实现这一点,该函数只需在try...excepttry...except...else块中调用旧的线程函数)。然后问题就变成了“如何从一个线程传递信息”,我想您已经知道如何做到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接