信号处理程序在线程启动后不起作用
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
得到了正确处理。然而,这只是基于我的观察。如果有人能想出一个正确的解释那就太好了。
我认为 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
得到了正确处理。然而,这只是基于我的观察。如果有人能想出一个正确的解释那就太好了。