2010-04-01 37 views

Respuesta

35

Marque esta pregunta. La respuesta correcta tiene gran explicación sobre la manera de poner fin a las discusiones de la manera correcta: Is there any way to kill a Thread in Python?

Para hacer que el tope de la rosca en el teclado de la señal de interrupción (Ctrl + C) se puede detectar la excepción "KeyboardInterrupt" y la limpieza antes de salir. De esta manera:

try: 
    start_thread() 
except (KeyboardInterrupt, SystemExit): 
    cleanup_stop_thread() 
    sys.exit() 

De esta manera puede controlar qué hacer cada vez que el programa se interrumpe bruscamente.

También puede utilizar la incorporada en el módulo de señales que le permite manejadores de señales de configuración (en el caso específico de la señal SIGINT): http://docs.python.org/library/signal.html

+0

Muchas gracias por su respuesta. Puede que no haya formulado la pregunta correctamente. En el ejemplo dado en esa pregunta, todavía era necesario ejecutar la función stop() del hilo. Cuando termino un programa anormalmente con Ctrl + C, eso no puede suceder. Entonces, mi pregunta es un poco como, "¿cómo llamo a la función mythread.stop() si el flujo de hilo principal se interrumpe" – facha

+0

Edité mi pregunta :) – rogeriopvl

+2

¿Cómo nadie ha notado aún el punto y coma en el ejemplo de código? ¡Amandolo! –

65

Si realiza su trabajador Roscas demonio, morirán cuando todo su hilos no daemon (por ejemplo, el hilo principal) han salido.

http://docs.python.org/library/threading.html#threading.Thread.daemon

+2

Gracias por la respuesta simple y precisa, el subproceso de subprocesamiento predeterminado. El estado del daemon de subproceso 'isDaemon()' es False, establézcalo True por 'setDaemon (True)'. – Tony

+1

Esto responde la pregunta y simplemente funciona. El operador no preguntó cómo salir de los hilos limpiamente en general. –

9

Uso del módulo atexit de la biblioteca estándar de Python para registrar funciones de "terminación" que serán llamadas (en el hilo principal) en cualquier terminación razonablemente "limpia" del hilo principal, incluyendo una excepción no capturada como KeyboardInterrupt. Dichas funciones de terminación pueden (aunque inevitablemente en el hilo principal) llamar a cualquier función stop que requiera; junto con la posibilidad de establecer un hilo como daemon, que le brinda las herramientas para diseñar correctamente la funcionalidad del sistema que necesita.

+0

Tenga en cuenta que este enfoque funcionó sin necesidad de hilos daemonized en las versiones de Python anteriores a 2.6.5, vea la respuesta a http://stackoverflow.com/questions/3713360/python-2-6-x-theading-signals-atexit-fail- en algunas versiones Esto es desafortunado en mi humilde opinión, ya que los hilos daemon durante el cierre son un poco desordenantes antes de Python 3.4 (http://bugs.python.org/issue19466). Si detiene _y_ une sus hilos daemon en sus manejadores atexit, todo debería estar bien, al costo (probablemente insignificante) de serializar el desmontaje de su hilo. – NeilenMarais

4

Si genera un hilo como tal - myThread = Thread(target = function) - y luego myThread.start(); myThread.join(). Cuando se inicia CTRL-C, el hilo principal no se cierra porque está esperando esa llamada de bloqueo myThread.join(). Para solucionar esto, simplemente ponga un tiempo de espera en la llamada .join(). El tiempo de espera puede ser el tiempo que desee. Si desea que espere indefinidamente, simplemente espere mucho tiempo, como 99999. También es una buena práctica hacer myThread.daemon = True para que todos los subprocesos salgan cuando el hilo principal (no demonio) finalice.

+0

'myThread.daemon = True' es una solución maravillosa para este problema. – Brannon

+0

@Brannon '.daemon = True' no es una solución sólida. Consulte este hilo para obtener una explicación: https://stackoverflow.com/a/20598791/5562492 –

Cuestiones relacionadas