9

今天我遇到了这样一个事实,即sys.exit()从子线程调用不会杀死主进程。我以前不知道这一点,这没关系,但我需要很长时间才能意识到这一点。如果可以打印到,它会节省很多时间。但它没有。sys.exit(msg)msgstderr

事实证明,这不是我的应用程序中的真正错误。它以一种有意识的方式调用sys.exit(msg)了一个有意义的错误——但我就是看不到这一点。

sys.exit()它的文档中声明“[...] 任何其他对象都被打印到sys.stderr并导致退出代码为 1”

对于来自子线程的调用,情况并非如此,其中显然表现sys.exit()thread.exit()“引发 SystemExit 异常。如果没有被捕获,这将导致线程静默退出”

我认为当程序员想要sys.exit(msg)打印一条错误消息时,应该只打印它——与调用它的位置无关。为什么不?我目前看不出任何原因。至少文档中应该有一个提示,sys.exit()即消息不是从线程中打印出来的。

你怎么看?为什么从线程中隐藏错误消息?这有意义吗?

最好的祝福,

扬-菲利普·格尔克

4

2 回答 2

7

我同意 Python 文档在由主线程以外的线程调用/引发时关于 sys.exit 和 SystemExit 是不正确的,或者更准确地说是不完整的;请在 Python 在线跟踪器上打开一个文档问题,以便可以在未来的文档迭代中解决这个问题(可能是在不久的将来——文档修复比代码修复更容易和更顺畅;-)。

当然,补救措施非常简单——只需将您用作 a 目标的任何函数包装成threading.Thread一个装饰器,该装饰器在它周围执行try/except SystemExit, e:并执行您需要的“写入 stderr”额外功能(或者,也许更好, 而是使用 logging.error 调用)在终止之前。但是,对于您正确指出的文档问题,除非并且直到遇到问题并且实际上必须花费一些时间进行调试才能解决问题,否则很难考虑这样做,因为您必须这样做做(代表核心python开发人员集体——对不起!)。

于 2009-07-30T21:03:33.657 回答
0

并非python中的所有线程都是平等的。从线程调用 sys.exit 并不会真正退出系统。因此,从子线程调用 sys.exit() 是没有意义的,因此它的行为与您期望的方式不同是有道理的。

本页更多地讨论线程对象,以及线程和特殊的“主”线程之间的区别

于 2009-07-30T20:38:22.070 回答