2013-07-17 153 views
1

我想在多線程python程序中執行某個信號處理程序。 我注意到我的信號處理函數被調用主線程和我創建的另一個線程(thread_1)。 有沒有辦法僅對thread_1執行信號處理程序? 或者有無論如何知道信號處理程序的調用線程的線程ID?它是主線程還是thread_1?python多線程信號

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' 

得到一個輸出:

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

正如你可以用信號處理函數被調用兩次(一個主線程,另一個用於thread_1),正如我上面問,我想只執行處理程序爲thread_1甚至找到一種方法來獲得調用線程的thread_id?

回答

1

的信號在兩個獨立的過程而不是兩個不同的線程單個進程進行處理。 (提示:您import multiprocessing而不是import threading。)

子進程繼承SIGINT的信號處理程序並獲取它自己的副本x。現在,shell在前臺進程組中運行父進程和子進程,並將鍵盤生成的信號(如Ctrl-C => SIGINT)發送到整個進程組,這就是爲什麼父進程和子進程都接收信號。然後,父母和孩子打印自己的價值x

如果你確實切換到了線程化的實現,那麼only the main thread會收到信號,你的問題將是沒有意義的。