【问题标题】:Python exit handlersPython 退出处理程序
【发布时间】:2015-06-23 12:09:57
【问题描述】:

我对在 Python 应用程序中安装退出处理程序的许多不同方法感到有些困惑。有atexit.register()signal.signal(SIG, handler),但我不确定哪一个适合我的情况。

我有一个从命令行启动的主进程,它生成了许多其他子进程作为守护进程。然后它joins 进程并等待它们完成。子进程运行无限循环(可以通过标志中断,但不确定如何触发)。当主进程通过 CTRL+C 关闭或收到终止信号时,我想在子进程中调用一些清理代码。

考虑到 2 个退出处理程序方法(或者可能还有更多),实现这一目标的最佳方法是什么。

【问题讨论】:

    标签: python process exit


    【解决方案1】:

    来自atexit的文档:

    这样注册的函数会在解释器正常终止时自动执行。

    注意:当程序被 Python 未处理的信号杀死、检测到 Python 致命内部错误或调用 os._exit() 时,不会调用通过此模块注册的函数。

    因此,如果您想对信号做出反应,请使用signal.signal

    【讨论】:

    • 信号挂钩中的sys.exit() 是否可以工作,而将清除留给atexit?这不应该满足所有情况(正常退出和强制退出)吗?我怎样才能捕捉到SIGKILL(如果有的话)?
    最近更新 更多