2008-10-10 13 views
161

En el Python documentation que dice:Daemon Hilos Explicación

Un hilo puede ser marcado como un "hilo de utilidad". La importancia de esta bandera es que todo el programa Python se cierra cuando solo quedan los hilos 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 desea establecer los hilos como daemonic?


Para aclarar para mí:

lo que la única vez que no lo haría hilos conjunto como demoníaca es si usted quiere que continúen funcionando después de las principales salidas de rosca?

Respuesta

319

Algunos subprocesos realizan tareas en segundo plano, como el envío de paquetes keepalive o la realización periódica de recolección 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ía que hacer un seguimiento de ellos, y decirles que salgan, antes de que su programa pueda cerrarse 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.

+11

Esto realmente es una gran explicación, porque usted menciona qué tareas del mundo real uno podría asignar como hilos daemon. ¡Gracias! – dotancohen

+0

Entonces, si tengo un subproceso secundario que está realizando una operación de escritura de archivo que está establecida en no deamon, ¿significa eso que debo salir de manera explícita? –

+3

@san ¿Qué hace el hilo del escritor después de que haya terminado de escribir? ¿Simplemente regresa? Si es así, eso es suficiente. Los subprocesos Daemon suelen ser cosas que se ejecutan en un bucle y no salen por sí solos. –

21

Digamos que está creando algún tipo de widget de tablero de instrumentos. Como parte de esto, desea que muestre el recuento de mensajes no leídos en su casilla de correo electrónico. Así que crea 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 se inicia su widget, 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.

13

Una manera más simple de pensarlo, quizás: cuando las devoluciones 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.

9

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

En sentido estricto nunca los necesita, sólo hace más fácil aplicación en algunos casos.

+0

¿Todavía este problema con python 3? No hay información clara sobre estas "extrañas excepciones" en la documentación. – iwalktheline

+0

Esos enlaces no son accesibles. – Tshepang

+0

El primer enlace es mi blog personal, está temporalmente inactivo ya que el proveedor de hosting no funciona. Espero que vuelva pronto. Me está costando más encontrar la publicación a la que se hace referencia en el segundo enlace. –

4

Citando a Chris: "... cuando se cierra el programa, los subprocesos de daemon se eliminan 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.

8

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 debe 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 subprocesos 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.

+0

¡Ten cuidado con eso! Si un programa envía una _importante_ tarea (p., actualice algún archivo "en segundo plano") a una cola de tareas de daemon, entonces existe el riesgo de que el programa finalice antes de realizar la tarea o, lo que es peor, en el medio de la actualización de ese archivo. –