2024-04-19 22:49:51 发布
网友
我正在用python2.5编写一个守护程序程序。在主进程中,一个退出处理程序注册到atexit模块中,似乎在每个子进程结束时都会调用该处理程序,这不是我所期望的。在
atexit
我注意到pythonatexitdoc中没有提到这种行为,有人知道这个问题吗?如果这就是它的行为方式,我如何在子进程中注销退出处理程序?有一个atexit.注销在版本3.0中,但我使用的是2.5。在
当您fork生成子进程时,该子进程是父进程的精确副本,当然包括注册的退出函数以及所有其他代码和数据结构。我相信这就是你所观察到的问题,当然在每个模块中都没有提到,因为它必然适用于每一个模块。在
fork
atexit.register()基本上是在atexit._exithandlers中注册您的函数,这是sys.exitfunc()调用的函数的模块私有列表。您可以将exitfunc()设置为自定义的退出处理程序函数,然后检查子级状态或简单地注销它。将3.0atexit.py复制到本地源代码树并使用它呢?在
atexit.register()
atexit._exithandlers
sys.exitfunc()
exitfunc()
atexit.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处理程序。为了避免践踏它们,您可以尝试:
logging
其中my_handler_func是您注册的atexit处理程序,它应该删除您的条目而不删除其他条目。在
my_handler_func
当您
fork
生成子进程时,该子进程是父进程的精确副本,当然包括注册的退出函数以及所有其他代码和数据结构。我相信这就是你所观察到的问题,当然在每个模块中都没有提到,因为它必然适用于每一个模块。在atexit.register()
基本上是在atexit._exithandlers
中注册您的函数,这是sys.exitfunc()
调用的函数的模块私有列表。您可以将exitfunc()
设置为自定义的退出处理程序函数,然后检查子级状态或简单地注销它。将3.0atexit.py
复制到本地源代码树并使用它呢?在编辑:我复制了自动退出.py从我的2.6版本扩展到
如果你用它代替你原来的版本,它应该可以工作。不过,我还没有用子流程测试过它。在
在Python 2.5中没有一个API可以实现这一点,但是您可以:
在您的子进程中-如果您知道您只安装了一个出口处理程序,并且没有安装其他处理程序。但是,请注意stdlib的某些部分(例如
^{pr2}$logging
)注册atexit
处理程序。为了避免践踏它们,您可以尝试:其中
my_handler_func
是您注册的atexit
处理程序,它应该删除您的条目而不删除其他条目。在相关问题 更多 >
编程相关推荐