有序关闭 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,它们会定期检查),等待它们完成(通过joining 他们),然后从其main 函数返回。

【讨论】:

虽然您的观点肯定是正确的,但应该提到的是,Java VM 实际上并不关心这一点。它提供了一种运行关闭处理程序的方法,即使在非守护线程仍在运行时也会关闭。我希望在 Python 中存在类似的做事方式。

以上是关于有序关闭 Python 环境的主要内容,如果未能解决你的问题,请参考以下文章

可拖动组件[关闭]

如何保持代码整洁有序? [关闭]

了解python开发环境ide、文本编辑器等[关闭]

向有序交易组添加唯一 ID [关闭]

添加删除嵌套的有序列表[关闭]

将模型分成网格以进行深度有序渲染 [关闭]