线程启动后信号处理程序不起作用
问题描述:
我认为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
功能不会被触发,导致没有被打印出来。但是,如果在线程启动之前(在3秒的睡眠时间内)我可以打到Ctrl + C
,我确实看到了Stop pressing the CTRL+C!
打印。我不知道为什么这是这样的行为,我可以如何解决这个问题。 PS:如果你需要threadRunner
类的代码,我会提供这个。
答
我已经通过在父线程中添加一个无限循环来修复它。所以更新的代码看起来是这样的:
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
被正确处理。但是,这只是基于我的观察。如果有人能够提出一个适当的解释,那将是很棒的。