2011-07-06 17 views
6

Estoy escribiendo una aplicación Python multiproceso en Windows.Ctrl-C no funciona cuando se usa threading.Timer

Yo solía terminar la aplicación usando ctrl-c, pero una vez que agregué threading.Timer instancias ctrl-c dejó de funcionar (o a veces lleva mucho tiempo).

¿Cómo podría ser esto?
¿Cuál es la relación entre tener hilos de temporizador y ctrl-c?

UPDATE:
I encontró lo siguiente en thread documentation de Python:

Hilos interactúan extrañamente con interrupciones: la excepción KeyboardInterrupt será recibido por un hilo arbitrario . (Cuando el módulo de señales está disponible, interrumpe siempre van al hilo principal.)

+0

¿es posible pegar el código aquí? – Rahul

Respuesta

4

La forma threading.Thread (y por lo tanto threading.Timer) funciona es que cada hilo en sí se registra con el módulo threading, y al salir intérprete el El intérprete esperará a que todos los hilos registrados salgan antes de terminar el intérprete propiamente dicho. Esto se hace para que los hilos realmente terminen la ejecución, en lugar de tener el intérprete eliminado brutalmente de ellos. Entonces, cuando toca^C, el hilo principal recibe la señal, decide terminar y espera a que finalicen los temporizadores.

Puede establecer hilos daemonic (con el método setDaemon) para hacer que el módulo threading no esperó a que estos hilos, pero si llegan a ser la ejecución de código Python, mientras que las salidas de interpretación, se obtienen errores confusos durante la salida. Incluso si cancela el threading.Timer (y lo configura daemonic), puede despertarse mientras se destruye el intérprete, ya que el método threading.Timercancel le dice al threading.Timer que no ejecute nada cuando se despierta, pero tiene que ejecutarse realmente Código de Python para hacer esa determinación.

No hay una manera elegante de terminar subprocesos (que no sea el actual), y no existe una manera confiable de interrumpir un subproceso bloqueado. Un enfoque más manejable para los temporizadores suele ser un ciclo de eventos, como los que las GUI y otros sistemas basados ​​en eventos le ofrecen. Qué usar depende completamente de qué más su programa estará haciendo.

+0

Gracias por la vista más grande. Por el momento marqué el daemonic de hilos que resolvió el problema, pero creo que en algún momento tendré que refactorizar para tener un flujo de terminación adecuado. – Jonathan

+0

¿se ejecutará el controlador de señal, si el temporizador está configurado en el mismo hilo? Si es así, si se puede establecer un temporizador. Canary en el manejador de señal, ¿puede el proceso salir ahora? – Vivek

+0

+1. ¿Hay algún recurso que explique por qué * no hay una forma elegante de terminar subprocesos (que no sea el actual), y no hay manera confiable de interrumpir un hilo que está bloqueado "*? – n611x007

2

Hay una presentación de David Beazley que arroja algo de luz sobre el tema. El PDF está disponible here. Mire alrededor de las páginas 22--25 ("Interludio: Señales" a "Señales congeladas").

+0

¡De hecho, es un PDF revelador! – Jonathan

Cuestiones relacionadas