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

事实证明,这不是我申请中的真正错误;它以一种意志性的方式将 sys.exit(msg)称为有意义的错误 - 但我只是看不到这一点。

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

对于来自子线程的调用, ,其中 sys.exit()显然表现为 thread.exit() "提升SystemExit异常。如果没有捕获,这将导致线程静默退出"

我认为当程序员想要 sys.exit(msg)来打印错误消息时,应该只打印它 - 独立于调用它的位置。为什么不?我目前看不出任何理由。至少应该在 sys.exit()的文档中提示不从线程打印消息。

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

致以最诚挚的问候,

Jan-Philip Gehrcke

有帮助吗?

解决方案

我同意,当sys.exit和SystemExit被主要线程之外的线程调用/引发时,Python文档是不正确的,或者可能更准确地说是不完整的;请在Python在线跟踪器上打开一个doc问题,这样可以在将来的文档迭代中解决(可能是近期的一个 - 文档修复比代码修复更简单,更顺畅; - )。

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

其他提示

并非python中的所有线程都是相同的。从线程调用sys.exit实际上不会退出系统。因此,从子线程调用sys.exit()是没有意义的,所以它的行为与你期望的不一样。

页面详细介绍了线程对象以及线程与线程之间的差异特殊的“主要”线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top