有序关闭 Python 环境
Posted
技术标签:
【中文标题】有序关闭 Python 环境【英文标题】:Shutting down a Python environment orderly 【发布时间】:2014-04-13 16:53:15 【问题描述】:我能想到的退出 Python 环境的明显方法是 sys.exit()
或 os._exit()
。然而,sys.exit()
不能在主线程之外工作,并且os._exit()
不能运行关闭处理程序(例如,那些通过atexit.register
注册的处理程序)。此外,当有非守护线程运行时,仅退出主线程(例如,可能通过thread.interrupt_main
影响)也不会关闭环境的其余部分。
有没有办法让 Python 从另一个线程而不是运行关闭处理程序的主线程退出?
【问题讨论】:
请注意,如果有人向您的程序发送 SIGKILL 或出现电源故障,则 atexit 将永远不会运行。你永远不应该依赖 atexit 运行任何重要的东西(例如那些修改持久数据的东西)。鉴于 atexit 是不可靠的,那么很明显,任何关键的清理/恢复都应该在程序下次再次启动时运行。换句话说,永远不要依赖有序的退出。 @LieRyan:当然,我知道这一点,但在某些情况下,如果可能的话,在程序之后进行清理只是很好,即使它不是关键。 【参考方案1】:这取决于您所说的“有序”。
即使你没有任何非守护线程,如果你从主线程调用sys.exit()
,其他线程也不会以“有序”的方式完成。无法保证他们会自行清理。
唯一真正干净的方法是让主线程向其他线程发出信号,它们应该完成并中止(例如,通过设置标志或Event
,它们会定期检查),等待它们完成(通过join
ing 他们),然后从其main
函数返回。
【讨论】:
虽然您的观点肯定是正确的,但应该提到的是,Java VM 实际上并不关心这一点。它提供了一种运行关闭处理程序的方法,即使在非守护线程仍在运行时也会关闭。我希望在 Python 中存在类似的做事方式。以上是关于有序关闭 Python 环境的主要内容,如果未能解决你的问题,请参考以下文章