2

我想在多线程 python 程序中执行某个信号处理程序。我注意到我的信号处理程序是为主线程和我创建的另一个线程(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'

得到一个输出:

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?

4

1 回答 1

2

信号在两个单独的进程中处理,而不是在单个进程的两个不同线程中处理。(提示:你import multiprocessing而不是import threading。)

子进程继承 SIGINT 的信号处理程序并获得自己的x. 现在,shell 在前台进程组中运行您的父进程和子进程,并将键盘生成的信号(如 Ctrl-C => SIGINT)发送到整个进程组,这就是父进程和子进程都收到信号的原因。然后,父母和孩子都打印自己的价值x

如果您确实切换到线程实现,那么只有主线程会接收信号,您的问题将没有实际意义。

于 2013-07-17T18:17:24.803 回答