Si tengo un hilo en un ciclo infinito, ¿hay alguna forma de terminarlo cuando el programa principal finaliza (por ejemplo, cuando presiono ctrl+C
)?python: cómo finalizar un hilo cuando finaliza el programa principal
Respuesta
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
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
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
Esto responde la pregunta y simplemente funciona. El operador no preguntó cómo salir de los hilos limpiamente en general. –
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.
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
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.
'myThread.daemon = True' es una solución maravillosa para este problema. – Brannon
@Brannon '.daemon = True' no es una solución sólida. Consulte este hilo para obtener una explicación: https://stackoverflow.com/a/20598791/5562492 –
- 1. Terminar el proceso ejecutado con `exec` cuando el programa finaliza
- 2. Los subprocesos hijo salen cuando finaliza el subproceso principal
- 3. ¿El programa Clojure no sale cuando finaliza la última declaración?
- 4. Mientras el ciclo no finaliza cuando la bandera cambia en un hilo diferente
- 5. Java: ¿Cómo ejecutar el hilo por separado desde el programa/clase principal?
- 6. ¿Cómo puedo terminar ncurses sin finalizar el programa C++?
- 7. NSTask bloqueando el hilo principal
- 8. python: ¿Cómo detectar cuando mi hilo queda huérfano?
- 9. Excepción de System.IO.IOException al intentar finalizar el hilo
- 10. NSFileManager removeItemAtPath bloquea el hilo principal
- 11. 'Excepción en hilo java.lang.NoClassDefFoundError 'principal'' cuando el programa Java se ejecuta desde la línea de comandos
- 12. ¿Cómo especificar el selector cuando CAKeyframeAnimation finaliza?
- 13. iPhone: ¿Cómo determinar si el hilo es el hilo principal?
- 14. ¿Cómo detectar cuando finaliza la aplicación?
- 15. ¿Cómo finalizar un programa en C++ después de un error?
- 16. 'java.lang.NoSuchMethodError: Excepción principal de hilo 'principal''
- 17. NSOperation y NSNotificationCenter en el hilo principal
- 18. ¿Cómo finalizar un hilo gestionado bloqueado en código no administrado?
- 19. ¿Cómo puedo finalizar un hilo de Lua limpiamente?
- 20. Cómo finalizar un programa en Perl: ¿salir o morir?
- 21. NSURLConnection bloquea el hilo principal?
- 22. AudioServicesPlaySystemSound y el hilo principal
- 23. Detectar cuando el proceso primario finaliza
- 24. ¿Cómo hacer que Qt funcione cuando el hilo principal está ocupado?
- 25. Cómo cerrar un jframe sin cerrar el programa principal
- 26. Método de ejecución en el hilo principal de otro hilo
- 27. Compruebe si el hilo actual es el hilo principal
- 28. llamando al hilo principal desde el hilo Runnable en java
- 29. ¿Llamar a un método en el hilo principal?
- 30. terminando un hilo secundario del hilo principal (cacao)
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
Edité mi pregunta :) – rogeriopvl
¿Cómo nadie ha notado aún el punto y coma en el ejemplo de código? ¡Amandolo! –