用于子进程的信号处理程序和coverage.py的atexit

时间:2018-05-05 13:13:06

标签: python signals code-coverage

  

要成功编写覆盖数据文件,请使用Python子流程   正在分析中必须干净利落地关闭并有机会   coverage.py运行它注册的atexit处理程序。

     

例如,如果您发送SIGTERM以结束子流程,但是您的   子进程从未注册任何SIGTERM处理程序,然后是一个覆盖   文件不会被写入。有关详细信息,请参阅atexit文档   处理程序未运行。

以上document似乎表示如果我使用SIGTERM信号杀死子进程以便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)

如果没有,该文件意味着什么?

1 个答案:

答案 0 :(得分:0)

使用问题中定义的空信号处理程序,程序现在将忽略SIGTERM,这对于coverage.py非常有用,但是现在您的程序在收到TERM信号后将不会退出。处理程序需要以某种方式与进程的主线程进行通信,以使其停止运行,并迅速而优雅地进行。

如果您的程序使用线程,则它可能必须与每个线程接触,并类似地与它们通信,是时候停止它们在做什么了。您将要尝试避免信号处理程序中的任何复杂性,因为它不必知道程序的其余部分在做什么,但是无论哪种方式,将SIGTERM发送到您的程序都应该使它正常关闭下来,这是要实现的程序,而不是coverage.py,而不是您要运行的操作系统。

对于原始海报,这个答案可能有点晚了,但是我希望其他人会觉得有用。