gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:40 25 4
gpt4 key购买 nike

我认为 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 秒 sleep 时间内),我确实会看到 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 得到了正确处理。然而,这只是基于我的观察。如果有人能提出正确的解释,那就太好了。

关于python - 信号处理程序在线程启动后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46657266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com