En la documentación de Python dice:
Un hilo se puede marcar como un "hilo de demonio". La importancia de este indicador es que todo el programa Python se cierra cuando solo quedan hilos de daemon. El valor inicial se hereda del hilo de creación.
¿Alguien tiene una explicación más clara de lo que eso significa o un ejemplo práctico que muestra dónde establecería los hilos daemonic
?
Aclárelo para mí: entonces, ¿la única situación en la que no establecería subprocesos daemonic
es cuando desea que continúen ejecutándose después de que se cierre el subproceso principal?
fuente
None
en ese caso, pero no importa, el valor de retorno no se usa.Digamos que estás haciendo algún tipo de widget de tablero. Como parte de esto, desea que muestre el recuento de mensajes no leídos en su casilla de correo electrónico. Entonces haces un pequeño hilo que:
Cuando se inicia su widget, crearía este hilo, lo designaría como un demonio y lo iniciaría. Debido a que es un demonio, no tienes que pensarlo; cuando su widget salga, el hilo se detendrá automáticamente.
fuente
Otros carteles dieron algunos ejemplos de situaciones en las que usaría hilos de daemon. Mi recomendación, sin embargo, es nunca usarlos.
No es porque no sean útiles, sino porque hay algunos efectos secundarios negativos que puede experimentar si los usa. Los subprocesos de Daemon aún pueden ejecutarse después de que el tiempo de ejecución de Python comience a derribar cosas en el subproceso principal, lo que causa algunas excepciones bastante extrañas.
Más información aquí:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
Estrictamente hablando, nunca los necesita, solo facilita la implementación en algunos casos.
fuente
logging
y esperaba que, después de terminar el hilo, todos los objetos (descriptores de archivo para cada hilo / función), serían destruidos. Al final de mi programa, vi muchos resultados comoIOError: [Errno 24] Too many open files:
. Conlsof -p pid_of_program
, descubrí que los FD estaban abiertos, incluso los Thread / Functions han terminado su trabajo. ¿Solución alterna? Eliminando el controlador de registro al final de la función. Asídaemonic
Hilos, son poco fiables ...Una forma más sencilla de pensarlo, tal vez: cuando regrese main, su proceso no se cerrará si todavía hay subprocesos no daemon en ejecución.
Un pequeño consejo: el apagado limpio es fácil de equivocarse cuando hay hilos y sincronización involucrados; si puede evitarlo, hágalo. Use hilos de demonio siempre que sea posible.
fuente
Chris ya explicó qué son los hilos de daemon, así que hablemos sobre el uso práctico. Muchas implementaciones de grupos de subprocesos usan subprocesos de daemon para trabajadores de tareas. Los trabajadores son hilos que ejecutan tareas desde la cola de tareas.
El trabajador debe seguir esperando las tareas en la cola de tareas de forma indefinida, ya que no saben cuándo aparecerá una nueva tarea. El subproceso que asigna tareas (por ejemplo, el subproceso principal) solo sabe cuándo finalizan las tareas. El subproceso principal espera en la cola de tareas para quedar vacío y luego sale. Si los trabajadores son hilos de usuario, es decir, no demonios, el programa no terminará. Seguirá esperando a estos trabajadores que se ejecutan indefinidamente, a pesar de que los trabajadores no están haciendo nada útil. Marque los hilos de demonio de los trabajadores, y el hilo principal se encargará de matarlos tan pronto como termine de manejar las tareas.
fuente
Citando a Chris: "... cuando su programa se cierra, todos los hilos de demonio se eliminan automáticamente". Creo que eso lo resume todo. Debe tener cuidado cuando los use, ya que terminan abruptamente cuando el programa principal se ejecuta hasta su finalización.
fuente
Cuando su segundo subproceso no es Daemon, el subproceso principal principal de su aplicación no puede salir porque sus criterios de salida también están vinculados a la salida de subprocesos que no son Daemon. Los hilos no se pueden matar por la fuerza en python, por lo tanto, su aplicación tendrá que esperar realmente a que salgan los hilos que no son Daemon. Si este comportamiento no es lo que desea, configure su segundo hilo como daemon para que no impida que su aplicación salga.
fuente