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

时间:2017-10-10 01:19:44

标签: python linux multithreading sigint

我认为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类的代码,我将提供该代码。

1 个答案:

答案 0 :(得分:0)

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

SIGINT

我的观察说,由于在启动线程后没有更多代码要执行,因此父线程进入非活动状态。这就是为什么SIGINT没有得到妥善处理的原因。但是,循环使父线程保持活动状态,因此{{1}}被正确处理。但是,这只是基于我的观察。如果有人可以提出一个很好的解释。

相关问题