2011-01-06 12 views
8

I tienen una aplicación roscada escrito en Python, y cada vez que una interrupción es recibida a través Ctrl + C o, a veces con matanza, la aplicación se bloquea. Una traza de pila se presenta desde un subproceso, pero la aplicación permanece en primer plano, y generalmente tengo que crear un fondo con Ctrl + Z y luego intentar matarlo.señales de manipulación en Python Hilos

¿Cuál es la forma correcta de manejar las señales y el teclado interrumpe el interior de una aplicación roscada?

Respuesta

13

Si establece newthread.daemon = True antes de comenzar cada hilo, los hilos automáticamente serán asesinados cuando las principales salidas de rosca. Eso no es precisamente lo que estabas preguntando, pero por lo que has descrito, parece que valdría la pena saberlo.

+0

Entonces, supongo, la pregunta es si el hilo principal recibe Ctrl + C y otras señales por defecto. ** EDITAR: ** Esta pregunta es respondida por la publicación de @shanked. –

+0

sólo recuerda: "Daemon hilos se detienen bruscamente al apagar sus recursos (por ejemplo, archivos abiertos, las transacciones de bases de datos, etc.) no pueden ser liberados adecuadamente.". https://docs.python.org/2/library/threading.html y https://docs.python.org/3.4/library/threading.html – kkurian

5

La forma en que trabajé evitar este problema era hacer un módulo que podría mantenerse una lista de temas. El módulo también tenía un método que mataba a cada hilo en esa lista. Registré este método para llamar cuando se recibió la señal SIGINT. Por último, creé una clase contenedora para Thread que agregaría automáticamente la instancia creada a la lista de subprocesos.

+1

Por qué no usar threading.enumerate? –

+0

1) No sabía que existía. 2) El contenedor 'Thread' ya existía para hacer otras cosas que no eran relevantes para esta pregunta. Dicho esto, el proceso sigue siendo el mismo. – unholysampler

1

Utilice signal module y continúe leyendo aquí Signal handlers and logging in Python sobre posibles trampas.

Con el fin de atrapar Ctrl+C acciones del usuario, tiene que profize un controlador signal para SIGINT.

Dentro del controlador de señal notifique (colas de mensajes o acceso de atributo RLock synchronized) sus hilos para apagar, o lo que sea que intente hacer.

+0

No sabía acerca de la interacción GIL (o no interacción) con señales. Eso explica algunos comportamientos con los que me he encontrado. –

Cuestiones relacionadas