python: cómo terminar un hilo cuando finaliza el progtwig principal

Si tengo un hilo en un bucle infinito, ¿hay alguna forma de terminarlo cuando finalice el progtwig principal (por ejemplo, cuando presiono Ctrl + C )?

Compruebe esta pregunta. La respuesta correcta tiene una gran explicación sobre cómo terminar los subprocesos de la manera correcta: ¿hay alguna forma de matar un hilo en Python?

Para hacer que el hilo se detenga en la señal de Interrupción del teclado (ctrl + c), puede detectar la excepción “Interrupción del teclado” y limpiar antes de salir. Me gusta esto:

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

De esta manera, puede controlar qué hacer cuando el progtwig se termina abruptamente.

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

Si crea los subprocesos de los subprocesos de trabajo, estos morirán cuando todos los subprocesos que no sean de demonio (por ejemplo, el subproceso principal) hayan salido.

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

Utilice el módulo atexit de la biblioteca estándar de Python para registrar las funciones de “terminación” que se llaman (en el hilo principal) en cualquier terminación razonablemente “limpia” del hilo principal, incluida una excepción no detectada como KeyboardInterrupt . Dichas funciones de terminación pueden (aunque inevitablemente en el hilo principal) llamar a cualquier función de stop que necesite; Junto con la posibilidad de establecer un hilo como daemon , le brinda las herramientas para diseñar adecuadamente la funcionalidad del sistema que necesita.

Si myThread = Thread(target = function) un Thread como así – myThread = Thread(target = function) – y luego haces myThread.start(); myThread.join() myThread.start(); myThread.join() . Cuando se inicia CTRL-C, el subproceso principal no se myThread.join() porque está esperando esa llamada myThread.join() locking. Para solucionar esto, simplemente ponga un tiempo de espera en la llamada .join (). El tiempo de espera puede ser tan largo como desee. Si desea que espere indefinidamente, solo póngalo en un tiempo de espera muy largo, como 99999. También es una buena práctica hacer myThread.daemon = True para que todos los subprocesos salgan cuando el subproceso principal (no daemon) finalice.

Intenta habilitar el sub-hilo como hilo-demonio.

Por ejemplo:

 from threading import Thread threaded = Thread(target=) threaded.daemon = True # This thread dies when main thread (only non-daemon thread) exits. threaded.start() 

O (en una línea):

 from threading import Thread threaded = Thread(target=, daemon=True).start() 

Cuando su hilo principal termina (“por ejemplo, cuando presiono Ctrl + C “) ese otro hilo mata con la instrucción anterior.