信号处理程序在线程启动后不起作用

signal handler does not work after threads are launched

我认为 SOF 中已经提出了类似的问题。但是,我无法真正找到适合我的特殊情况的合适解决方案。我正在尝试制作一个守护进程,它将在启动时打开几个工作线程并保持 运行 直到收到 SIGTERM。在收到 SIGTERM 后,父线程将终止所有工作线程,整个进程将停止。这是我的代码的样子:

from lib.threadrunner import ThreadRunner
import signal
import time

def sigint_handler(signum, frame):
    print 'Stop pressing the CTRL+C!'

signal.signal(signal.SIGINT, sigint_handler)

objectToRun = ClassToRun(cfg)

time.sleep(3)

# The below code uses threading module to create 3 threads
threadRunner = ThreadRunner()
threadRunner.load('Task Name', objectToRun)
threadRunner.start(3)
threadRunner.joinAll()

如果我在所有线程启动后点击 Ctrl + C 发送 SIGINT,sigint_handler 函数不会被触发,因为没有任何内容被打印出来。但是,如果我可以在线程启动之前点击 Ctrl + C(在添加的 3 秒睡眠时间内),我确实会看到打印了 Stop pressing the CTRL+C!。我不确定为什么会这样以及我该如何解决这个问题。

PS: 如果你需要 threadRunner class 的代码,我也会提供。

我已经通过在父线程中添加无限循环来修复它。所以更新后的代码如下所示:

from lib.threadrunner import ThreadRunner
import signal
import time

RUN = True

def sigint_handler(signum, frame):
    print 'Stop pressing the CTRL+C!'
    global RUN
    RUN = False

signal.signal(signal.SIGINT, sigint_handler)

objectToRun = ClassToRun(cfg)

time.sleep(3)

# The below code uses threading module to create 3 threads
threadRunner = ThreadRunner()
threadRunner.load('Task Name', objectToRun)
threadRunner.start(3)
# threadRunner.joinAll()

while RUN:
    time.sleep(1)

我的观察表明,由于启动线程后没有更多代码可执行,父线程进入非活动状态。这就是 SIGINT 没有得到正确处理的原因。但是,循环使父线程保持活动状态,因此 SIGINT 得到了正确处理。然而,这只是基于我的观察。如果有人能想出一个正确的解释那就太好了。