要成功地编写覆盖数据文件,分析中的Python子进程必须干净地关闭,并且coverage.py有机会运行它注册的atexit处理程序。 例如,如果您发送SIGTERM来结束子进程,但是您的子进程从未注册过任何SIGTERM处理程序,则不会写入覆盖文件。有关处理程序未运行的详细信息,请参阅atexit文档。
上面的文档似乎说,如果我用SIGTERM信号杀死一个子进程,那么coverage.py就需要为SIGTERM提供一个处理程序,这样coverage.py就可以运行它注册的atexit处理程序。
但是,我很困惑应该在coverage.py的处理程序中添加什么,甚至不确定我的理解是否正确。
例如,如果我的理解是正确的,
# Each sub-process should register the signal handler.
def signal_handler(signum, frame):
# What should I do in here for coverage.py?
# Is it just enough to register the empty handler?
pass
signal.signal(signal.SIGTERM, signal_handler)如果没有,这份文件意味着什么?
发布于 2019-11-04 19:30:12
使用问题中定义的空信号处理程序,程序现在将忽略SIGTERM,这对于coverage.py非常好,但是现在您的程序在接收到术语信号后不会退出。您的处理程序需要以某种方式与进程的主线程通信,告诉它停止它正在做的任何事情,既快速又优雅。
如果您的程序使用线程,它可能必须接触到每个线程,并以类似的方式向它们传达,是时候停止它们正在做的事情了。您可能希望将任何这种复杂性从您的信号处理程序中排除,因为它不应该知道您的程序的其余部分正在做什么,但是不管怎样,向您的程序发送SIGTERM应该会导致它优雅地关闭,而这是在程序上实现的,而不是coverage.py,而不是您正在运行的操作系统。
这个答案对于最初的海报来说可能有点晚了,但我希望其他人会发现它有用。
https://stackoverflow.com/questions/50189851
复制相似问题