我写使用python 2.5的守护程序。在主进程退出处理程序与atexit模块注册,它的似乎,当每个子进程结束的处理程序被调用,这是不是我的预期。

我注意到这种行为是不是在蟒蛇atexit文档提到,任何人知道这个问题?如果这是应该如何表现,我怎么能注销在子进程退出处理程序?有在3.0版中的atexit.unregister,但我使用2.5。

有帮助吗?

解决方案

有没有一个API来做到这一点在Python 2.5,但你可以:

import atexit
atexit._exithandlers = []

在你的子进程 - 如果你知道你只安装了一个退出处理程序,并且没有任何其他处理程序安装。但是,要知道的是,STDLIB(例如logging)的某些部分寄存器atexit处理程序。为了避免践踏它们,你可以尝试:

my_handler_entries = [e for e in atexit._exithandlers if e[0] == my_handler_func]
for e in my_handler_entries:
    atexit._exithandlers.remove(e)

其中my_handler_func是您注册的atexit处理程序,这应该删除您的项目而不删除等。

其他提示

当你fork以使孩子过程中,孩子是家长的精确拷贝 - 包括注册课程退出功能,以及其他所有代码和数据结构。我相信这就是你观察问题 - 当然它不是在每个模块所提到的,因为它一定适用于每一名

atexit.register()基本上登记在atexit._exithandlers你的功能,这是由称为sys.exitfunc()功能的模块私人列表。您可以设置exitfunc()您定制的退出处理函数,然后检查孩子的状态或者干脆注销了。怎么样仅仅复制3.0 atexit.py到本地源代码树和使用呢?

编辑:从我的2.6版本复制的atexit.py和

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

如果你采取的,而不是你的原始版本,它应该工作。我还没有与子过程测试,虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top