2017-10-10 139 views
0

我认为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类的代码,我会提供这个。

回答

0

我已经通过在父线程中添加一个无限循环来修复它。所以更新的代码看起来是这样的:

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被正确处理。但是,这只是基于我的观察。如果有人能够提出一个适当的解释,那将是很棒的。