2013-07-17 2 views
1

멀티 스레딩 파이썬 프로그램에서 특정 신호 처리기를 실행하고 싶습니다. 내 신호 처리기가 주 스레드와 내가 만든 다른 스레드 (thread_1)에 대해 호출되었음을 알았습니다. 어쨌든 thread_1에 대해서만 시그널 핸들러를 실행해야합니까? 또는 신호 처리기의 호출 스레드의 스레드 ID를 알기 위해 어쨌든 있습니까? 그것은 주 스레드 또는 thread_1입니까? 멀티 스레드 용 파이썬 신호

import signal 
import sys 
from multiprocessing import Process 
from time import sleep 
x = 3; 

def f(name): 
    print 'hello', name 
    while(1): 
     sleep (1) 
     print "AAAAAAAAAAAAAAAAAAAAAAAAA" 

def signal_handler(signal, frame): 
    global x 
    print 'You pressed Ctrl+C!' 
    print x 
    sys.exit(0) 

if __name__ == '__main__': 

    signal.signal(signal.SIGINT, signal_handler) 
    print 'Creating thread' 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    print 'Press Ctrl+C' 
    x += 6 
    signal.pause() 
    print 'After press CTRL+C' 

는 출력 얻었다 : 당신이 (thread_1 메인 스레드에 대한 다른 하나) 두 번 호출되는 핸들러를 신호 수 있듯이

Creating thread 
Press Ctrl+C 
hello bob 
AAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAA 
^CYou pressed Ctrl+C! 
You pressed Ctrl+C! 
9 
3 

을, 나는 위의 질문으로, 나는 핸들러 만 실행하고 싶습니다 thread_1 또는 심지어 호출 스레드의 thread_id를 얻는 방법을 찾으십니까?

답변

1

신호는 두 개의 분리 된 프로세스 보다는 두 가지 단일 스레드 프로세스에서 처리된다. (힌트 :. 당신 import multiprocessing보다는 import threading)

자식 프로세스는 SIGINT에 대한 신호 처리기를 상속 x의 복사본을 가져옵니다. 이제 쉘은 포어 그라운드 프로세스 그룹에서 부모 프로세스와 자식 프로세스를 모두 실행하고 전체 프로세스 그룹에 키보드 생성 신호 (예 : Ctrl-C => SIGINT)를 전송하므로 부모와 자식 모두 신호를 수신하게됩니다. 부모와 자식 모두 자신의 값인 x을 인쇄합니다.

스레드 구현으로 전환하면 only the main thread에 신호가 수신되고 질문이 문제가됩니다.

관련 문제