已注册的atexit处理程序通过催生子进程继承?
-
20-08-2019 - |
题
我写使用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))
如果你采取的,而不是你的原始版本,它应该工作。我还没有与子过程测试,虽然。
不隶属于 StackOverflow