Un hilo demonio es un tipo de hilo que corre en segundo plano y es automáticamente finalizado cuando el programa principal (o todos los hilos no-demonio) termina. Son útiles para tareas de fondo que no deben impedir la salida del programa.
Por ejemplo, un hilo demonio podría usarse para registrar datos en un archivo de registro o escuchar en segundo plano ciertas señales de red sin impedir que el programa principal se cierre.
En Python, un demonio (o daemon) es un hilo (o proceso) que se ejecuta en segundo plano y no bloquea la terminación del programa principal. Es decir, cuando el programa principal finaliza, los demonios se terminan automáticamente, sin esperar a que terminen su ejecución.
En Python, los hilos demonio (o daemon threads) son hilos en segundo plano que se ejecutan de manera independiente y no bloquean la finalización del programa. Estos hilos están diseñados para realizar tareas de apoyo que no necesitan completar su ejecución antes de que el programa termine. Un hilo marcado como demonio se detendrá automáticamente cuando todos los hilos principales hayan terminado su ejecución.
La propiedad daemon determina si puede sobrevivir a las circunstancias de finalización de los hilos de un proceso. Un hilo demonio tiene una baja prioridad y se suele ejecutar en segundo plano por ejemplo para realizar tareas de recogida de basura y no impiden que se termine un proceso termine cuando se hayan terminado todos los hilos no demonio.
Un valor booleano que indica si este hilo es un hilo demonio (True) o no (False). Debe ser establecido antes de que se llame a start()
, de lo contrario se lanzará un RuntimeError
. Su valor inicial se hereda del hilo creador; el hilo principal no es un hilo demonio y por lo tanto todos los hilos creados en el hilo principal tienen por defecto un valor daemon = False
.
import threading
import time
def daemon_task():
while True:
print("Hilo demonio en ejecución...")
time.sleep(1)
# Crear y configurar un hilo demonio
daemon_thread = threading.Thread(target=daemon_task)
daemon_thread.daemon = True # Configura el hilo como demonio
daemon_thread.start()
print("Hilo principal en ejecución")
time.sleep(3)
print("Hilo principal finalizado")
Explicación:
El programa de Python en su totalidad finaliza cuando no queda ningún hilo no-demonio vivo.
from threading import *
import time
def hilo():
for i in range(10):
print('Hilo no Daemon (Foregoround)')
time.sleep(1)
t = Thread(target=hilo)
t.start()
time.sleep(5)
print('Hilo principal')
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo principal
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Hilo no Daemon (Foregoround)
Aquí el hilo principal SE ESPERA a que todos los hilos terminen para terminar el proceso.
from threading import *
import time
def hilo():
for i in range(10):
print('Hilo no Daemon (Backgoround)')
time.sleep(1)
t = Thread(target=hilo)
t.daemon = True
t.start()
time.sleep(5)
print('Hilo principal')
Hilo no Daemon (Backgoround)
Hilo no Daemon (Backgoround)
Hilo no Daemon (Backgoround)
Hilo no Daemon (Backgoround)
Hilo no Daemon (Backgoround)
Hilo principal
Hilo no Daemon (Backgoround)
Aquí una vez termina el hilo principal, el resto de hilos son abortados.
from threading import *
import time
def hilo():
#time.sleep(1)
print("Hola")
T = Thread(target = hilo)
T.daemon=True
T.start()
Aquí a pesar de crear el hilo con la propiedad daemon a True, se imprime el mensaje, esto es debido a que la finalización del hilo NO es inmediata. Si eliminado el comentario #time.sleep(1) comprobamos que ya no se escribe ya que ahora sí hay tiempo suficiente para abortar el hilo.
import threading
import time
def daemon_task():
while True:
print("Hilo demonio está ejecutándose.")
time.sleep(1)
def non_daemon_task():
for i in range(5):
print(f"Hilo no-demonio está en ejecución: iteración {i+1}")
time.sleep(1)
# Crear hilo demonio
daemon_thread = threading.Thread(target=daemon_task)
daemon_thread.daemon = True
daemon_thread.start()
# Crear hilo no-demonio
non_daemon_thread = threading.Thread(target=non_daemon_task)
non_daemon_thread.start()
# El hilo principal espera solo a que el hilo no-demonio termine
non_daemon_thread.join()
print("Hilo principal finalizado")
En este ejemplo:
daemon_thread
es un hilo demonio, por lo que se ejecutará en segundo plano y se detendrá automáticamente cuando el programa termine.non_daemon_thread
es un hilo regular que realiza 5 iteraciones con un retraso de 1 segundo cada una.non_daemon_thread
termine su ejecución con join()
, y después finaliza el programa, lo que automáticamente detiene daemon_thread
.Hilos demonio (daemon threads): En Python, se puede crear un hilo y marcarlo como demonio utilizando la propiedad daemon = True. Un hilo marcado como daemon tiene las siguientes características:
Cuando se crean hilos en Python, por defecto no son demonios (es decir, daemon = False). Si quieres cambiar este comportamiento para que el hilo sea un demonio, se puede hacer de la siguiente manera:
import threading
import time
def tarea():
while True:
print("Ejecutando tarea en segundo plano")
time.sleep(1)
# Crear un hilo y marcarlo como demonio
hilo = threading.Thread(target=tarea)
hilo.daemon = True # Establecer como demonio
hilo.start()
# Programa principal termina aquí, y el hilo demonio se detiene automáticamente
print("El programa principal ha terminado")
En el ejemplo anterior, el hilo demonio ejecuta la función tarea() en un bucle infinito. Sin embargo, como es un demonio, no se garantiza que complete sus iteraciones. Cuando el programa principal llega al final, el hilo demonio se detiene inmediatamente.
Los hilos demonio se utilizan para tareas que son auxiliares o no esenciales para el funcionamiento del programa. Por ejemplo, monitorear cambios en el sistema, manejar tareas de limpieza, o realizar operaciones que pueden ser interrumpidas sin consecuencias.
No garantizan finalización ordenada: Como los demonios terminan abruptamente cuando el programa principal termina, no deberían usarse para tareas críticas que requieren que se completen completamente, como guardar datos o realizar operaciones de red críticas.
Los hilos con daemon = True son hilos que se ejecutan en segundo plano y se detienen automáticamente cuando el programa principal finaliza, independientemente de si han terminado o no. Esto los hace útiles para tareas auxiliares que no deben bloquear la finalización del programa principal.