2017-10-10 14 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() 

나는 모든 스레드가 시작 후 SIGINT를 보내 Ctrl + C 충돌하는 경우가의 sigint_handler 기능이 트리거하지 않고, 아무것도 인쇄되지 가져옵니다 원인이된다. 그러나 스레드가 시작되기 전에 (내가 3 초의 수면 시간을 추가하는 동안) Ctrl + C을 칠 수 있다면 Stop pressing the CTRL+C!이 인쇄 된 것을 볼 수 있습니다. 왜 이런 식으로 행동하는지, 어떻게 해결할 지 모르겠다.

추신 : 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이 올바르게 처리되었습니다. 그러나 이것은 단지 나의 관찰에 근거한 것입니다. 누군가가 훌륭한 설명을 할 수 있다면 좋을 것입니다.