Python线程退出代码

Posted

技术标签:

【中文标题】Python线程退出代码【英文标题】:Python thread exit code 【发布时间】:2009-06-12 13:23:42 【问题描述】:

有没有办法判断线程是正常退出还是异常退出?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

如果成功,您可以将某个全局变量设置为 0,如果出现异常,则可以将其设置为非零。这是一个非常标准的约定。

但是,您需要使用互斥锁或信号量来保护此变量。或者您可以确保只有一个线程会写入它,而所有其他线程只会读取它。

【讨论】:

0 表示成功可能是一个非常标准的约定,但布尔值 succeded 在肉类解释器上不是更容易一些吗? 如果我继承Thread,它不必是全局的,只需要一个成员变量来表示成功。我只是想知道是否有任何内置方法可以做到这一点,比如进程退出代码。 线程和全局状态。两个伟大的品味 tate gsrat eogetherrrrrrrrrrrrrrr 分段错误,核心转储。 @Glyph 请注意我是如何提到互斥锁和信号量的。【参考方案3】:

让你的线程函数捕获异常。 (您可以使用一个简单的包装函数来执行此操作,该函数只调用 try...excepttry...except...else 块内的旧线程函数)。那么问题就变成了“如何将信息从一个线程传递到另一个线程”,我想你已经知道该怎么做了。

【讨论】:

以上是关于Python线程退出代码的主要内容,如果未能解决你的问题,请参考以下文章

Python - 正确杀死/退出期货线程?

如何在Python中退出主线程并使子线程在后台继续运行

为啥 sys.exit() 在 Python 的线程内调用时不退出?

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

python 并发编程

进程以退出代码 -1073741819 (0xC0000005) Python Tkinter GUI Canvas 更新完成