2009-07-27 9 views

Respuesta

9

En primer lugar, al configurar los controladores de señal utilizando el módulo signal, debe crearlos en el hilo principal. Recibirá una excepción si intenta crearlos en un hilo separado.

Los manejadores de señal registrados a través de la función signal.signal() siempre serán llamados en el hilo principal. En las arquitecturas que soportan enviar señales a hilos, en el nivel C, creo que el tiempo de ejecución de Python ignora todas las señales en los hilos y tiene un manejador de señal en el hilo principal, que utiliza para enviar a su manejador de señal de código Python.

La documentación para el módulo thread establece que el KeyboardInterrupt excepción (que de ordinario se desencadena por SIGINT) puede ser delivered to an arbitrary thread a menos que tenga el módulo signal a su disposición, que todos los sistemas Unix deberían tener. En ese caso, se entrega al hilo principal. Si está en un sistema sin signal, tendrá que atrapar KeyboardInterrupt en su hilo y llamar al thread.interrupt_main() para volver a subirlo en el hilo principal.

Más información se puede encontrar en los documentos de Python para los módulos thread y signal.

+0

Interesante, pensé que solo el hilo principal recibiría 'KeyboardInterrupt's. –

+0

¡Sí! Quién sabe por qué no lo es. –

+1

En mi experiencia, y al leer la documentación, cuando el módulo 'signal' está disponible,' KeyboardInterrupt' solo se entrega al hilo principal. – Miles

4

De la documentación signal:

Algunos se debe tener cuidado si se utilizan ambas señales y los hilos en el mismo programa. Lo fundamental para recordar al usar señales e hilos simultáneamente es: realizar siempre operaciones signal() en el hilo principal de ejecución. Cualquier hilo puede realizar un alarm(), getsignal(), pause(), setitimer() o getitimer(); solo el hilo principal puede establecer un nuevo manejador de señal, y el hilo principal será el único que recibirá señales (esto es reforzado por el módulo de señal de Python, incluso si la implementación del hilo subyacente admite el envío de señales a hilos individuales). Esto significa que las señales no pueden usarse como un medio de comunicación entre hilos. Use bloqueos en su lugar.

Cuestiones relacionadas