2013-07-17 2 views
1

Я хотел бы выполнить определенный обработчик сигнала в многопоточной программе python. Я заметил, что мой обработчик сигнала вызван для основного потока и другого потока (thread_1), который я создал. Есть ли способ выполнить обработчик сигнала только для thread_1? Или все равно знать идентификатор потока вызывающего потока обработчика сигнала? это основной поток или 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. Теперь оболочка запускает как родительский, так и дочерний процессы в группе процессов переднего плана и отправляет генерируемые с клавиатуры сигналы (например, Ctrl-C => SIGINT) во всю группу процессов, поэтому родительский и дочерний сигналы получают сигнал. И родительский, и дочерний, затем напечатайте собственное значение x.

Если вы переключитесь на резьбовую реализацию, тогда only the main thread получит сигналы, и ваш вопрос будет спорным.

Смежные вопросы