libro book python multithreading

python - book - el libro de django 2.0 pdf



Daemon Threads Explanation (6)

En la documentación de Python dice:

Un hilo se puede marcar como un "hilo daemon". La importancia de esta bandera es que todo el programa Python sale cuando solo quedan subprocesos 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 le gustaría establecer los hilos como daemonic ?

Para aclararme:

entonces, ¿la única vez que no configuraría threads como daemonic es si quisiera que continúen funcionando después de que el hilo principal salga?


Algunos subprocesos realizan tareas en segundo plano, como enviar paquetes de keepalive o realizar una recolección periódica de elementos no utilizados, o lo que sea. Estos solo son útiles cuando el programa principal se está ejecutando, y está bien eliminarlos una vez que los otros subprocesos, que no sean demonios, hayan salido.

Sin hilos daemon, tendrías que hacer un seguimiento de ellos, y decirles que salgan, antes de que tu programa pueda cerrar por completo. Al configurarlos como hilos de daemon, puede dejarlos correr y olvidarse de ellos, y cuando su programa se cierra, cualquier subproceso de daemon se elimina automáticamente.


Chris ya explicó qué son los hilos daemon, así que hablemos del uso práctico. Muchas implementaciones de grupo de subprocesos utilizan subprocesos de daemon para los trabajadores de tareas. Los trabajadores son hilos que ejecutan tareas desde la cola de tareas.

El trabajador necesita seguir esperando las tareas en la cola de tareas indefinidamente, ya que no sabe cuándo aparecerá la nueva tarea. El hilo que asigna tareas (por ejemplo, el hilo principal) solo sabe cuándo terminan las tareas. El hilo principal espera en la cola de tareas para quedar vacío y luego sale. Si los trabajadores son hilos de usuario, es decir, no demonio, el programa no finalizará. Seguirá esperando a estos trabajadores indefinidamente en funcionamiento, a pesar de que los trabajadores no están haciendo nada útil. Marque los hilos del daemon de los trabajadores, y el hilo principal se encargará de matarlos tan pronto como se hayan terminado las tareas de manipulación.


Citando a Chris: "... cuando tu programa se cierra, cualquier subproceso de daemon se elimina automáticamente". Creo que eso lo resume todo. Debe tener cuidado cuando los usa, ya que terminan abruptamente cuando el programa principal se ejecuta hasta su finalización.


Digamos que estás creando 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:

  1. Conéctese al servidor de correo y pregunte cuántos mensajes no leídos tiene.
  2. Señale la GUI con el recuento actualizado.
  3. Duerme un rato.

Cuando tu widget se inicie, creará este hilo, lo designará como daemon y lo iniciará. Como es un daemon, no tienes que pensar en eso; cuando tu widget se cierra, el hilo se detendrá automáticamente.


Otros carteles dieron algunos ejemplos de situaciones en las que usaría hilos 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 Daemon aún se pueden ejecutar después de que el tiempo de ejecución de Python comience a destruir cosas en el hilo principal, lo que provoca 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/343699.html

Estrictamente hablando, nunca los necesita, simplemente hace que la implementación sea más fácil en algunos casos.


Una manera más simple de pensarlo, quizás: cuando los retornos principales, su proceso no se cerrará si todavía hay subprocesos no-demonio en ejecución.

Un consejo: el apagado limpio es fácil de equivocarse cuando se trata de hilos y sincronización; si puede evitarlo, hágalo. Use hilos daemon siempre que sea posible.