今天我反对这样一个事实,即从一个子线程调用的sys.exit()
不会杀死主进程。我以前不知道这个,这没关系,但我需要很长时间才能意识到这一点。如果sys.exit(msg)
将msg
打印到stderr
,则可以节省更多时间。但它没有。
事实证明,这不是我申请中的真正错误;它以一种意志性的方式将sys.exit(msg)
称为有意义的错误 - 但我无法看到这一点。
In the docs for sys.exit()
it is stated:
“[...]任何其他对象打印到sys.stderr
并导致退出代码为1”
来自子线程的调用不正确,其中sys.exit()
显然表现为thread.exit()
:
“提升SystemExit异常。如果没有捕获,这将导致线程退出静默”
我认为当程序员希望sys.exit(msg)
打印错误消息时,这应该只是打印 - 独立于调用它的位置。为什么不?我目前看不出任何理由。至少应该在sys.exit()
的文档中提示消息不是从线程打印的。
致以最诚挚的问候,
Jan-Philip Gehrcke
答案 0 :(得分:6)
我同意,当sys.exit和SystemExit被主要线程之外的线程调用/引发时,Python文档是不正确的,或者可能更准确地说是不完整的;请在Python在线跟踪器上打开一个doc问题,这样可以在将来的文档迭代中解决(可能是近期的一个 - 文档修复比代码修复更简单,更顺畅; - )。
当然,补救措施非常简单 - 只需将您正在使用的任何功能包装为threading.Thread
的目标,并在其周围设置try
/ except SystemExit, e:
装饰器,并在终止之前执行所需的“写入stderr”额外功能(或者,更好的是,使用logging.error调用)。但是,由于您正确指出的文档问题,除非并且直到遇到问题并且实际上不得不花费一些时间进行调试以确定问题,否则很难考虑这样做,因为您必须do(代表核心python开发人员集体 - 抱歉!)。
答案 1 :(得分:0)
并非python中的所有线程都是相同的。从线程调用sys.exit实际上不会退出系统。因此,从子线程调用sys.exit()是没有意义的,所以它的行为与你期望的不一样。
这个page更多地讨论了线程对象,以及线程和特殊“主”线程之间的差异。