2017-10-10 138 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被正確處理。但是,這只是基於我的觀察。如果有人能夠提出一個適當的解釋,那將是很棒的。