Cómo usar un hilo separado para el manejo asíncrono de señales en python

A continuación se muestra mi código de prueba.
Cuando se ejecuta con python2.7, muestra que el progtwig no recibirá ninguna señal hasta que todas las hebras generadas terminen.
Mientras que con python3.2, solo se llama al sigintHandler del hilo principal.
Estoy confundido con cómo Python maneja los hilos y la señal, entonces, ¿cómo puedo generar un hilo y hacer el manejo de la señal dentro de ese hilo? ¿Es posible en absoluto?

from __future__ import print_function from threading import Thread import signal, os, sys from time import sleep def sigintHandler(signo, _): print("signal %d caught"%signo) def fn(): print("thread sleeping") sleep(10) print("thread awakes") signal.signal(signal.SIGINT, sigintHandler) ls = [] for i in range(5): t = Thread(target=fn) ls.append(t) t.start() print("All threads up, pid=%d"%os.getpid()) for i in ls: i.join() while True: sleep(20) 

Python no maneja las señales de forma asíncrona. Cuando instala un manejador de señales en python, el tiempo de ejecución instala un talón de manejador de señales C que solo establece un indicador. El intérprete verifica la bandera entre las instrucciones del código de bytes y luego invoca el controlador de señales de Python. Eso significa que los manejadores de señales solo pueden ejecutarse entre operaciones de código de bytes. Si el hilo principal de Python está ejecutando el código C, no podrá manejar las señales hasta que se complete la operación actual. Existe cierta disposición para que SIGINT (es decir, control-C) aborte el IO bloqueado, pero solo en el hilo principal.

Dicho esto, si desea ejecutar el código en un hilo basado en la recepción de una señal, la forma de hacerlo es recibir la señal en el hilo principal y luego enviar un mensaje al hilo trabajador a través de una Cola. Deberá asegurarse de que su hilo principal nunca se bloquee en una llamada no interrumpible. En Python 2.7, join no es interuptable (como has descubierto). En versiones posteriores de python es.

Usted dijo: Mientras que con python3.2, solo se llama al sigintHandler del hilo principal.

Creo que está bien. Desde aquí: Señales e hilos.

Los manejadores de señales de Python siempre se ejecutan en el hilo principal de Python, incluso si la señal se recibió en otro hilo. Esto significa que las señales no se pueden utilizar como un medio de comunicación entre subprocesos. Puede utilizar las primitivas de sincronización del módulo de subprocesamiento en su lugar.

Además, solo se permite que el hilo principal establezca un nuevo controlador de señal.