注册的atexit处理程序是否由派生的子进程继承?

2024-04-19 22:49:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python2.5编写一个守护程序程序。在主进程中,一个退出处理程序注册到atexit模块中,似乎在每个子进程结束时都会调用该处理程序,这不是我所期望的。在

我注意到pythonatexitdoc中没有提到这种行为,有人知道这个问题吗?如果这就是它的行为方式,我如何在子进程中注销退出处理程序?有一个atexit.注销在版本3.0中,但我使用的是2.5。在


Tags: 模块程序版本处理程序进程方式atexitpythonatexitdoc
3条回答

当您fork生成子进程时,该子进程是父进程的精确副本,当然包括注册的退出函数以及所有其他代码和数据结构。我相信这就是你所观察到的问题,当然在每个模块中都没有提到,因为它必然适用于每一个模块。在

atexit.register()基本上是在atexit._exithandlers中注册您的函数,这是sys.exitfunc()调用的函数的模块私有列表。您可以将exitfunc()设置为自定义的退出处理程序函数,然后检查子级状态或简单地注销它。将3.0atexit.py复制到本地源代码树并使用它呢?在

编辑:我复制了自动退出.py从我的2.6版本扩展到

def unregister(func, *targs, **kargs):
    _exithandlers.remove((func, targs, kargs))

如果你用它代替你原来的版本,它应该可以工作。不过,我还没有用子流程测试过它。在

在Python 2.5中没有一个API可以实现这一点,但是您可以:

import atexit
atexit._exithandlers = []

在您的子进程中-如果您知道您只安装了一个出口处理程序,并且没有安装其他处理程序。但是,请注意stdlib的某些部分(例如logging)注册atexit处理程序。为了避免践踏它们,您可以尝试:

^{pr2}$

其中my_handler_func是您注册的atexit处理程序,它应该删除您的条目而不删除其他条目。在

相关问题 更多 >