Los eventos o señales es otra forma de sincronizar hilos. Las señales son elementos booleanos que pueden estar activos o inactivos. La clase Event
tiene los siguientes métodos:
import threading
import time
def genera_eventos():
for x in range (5):
time.sleep(2)
ev.set()
def escribe_algo():
while (True):
ev.wait()
print ("hola")
ev.clear()
ev = threading.Event()
T1 = threading.Thread(target=genera_eventos)
T2 = threading.Thread(target=escribe_algo)
T1.start()
T2.start()
Aquí tenemos 2 hilos que corren en paralelo: uno activa un evento cada tres segundos y el otro escribe mensajes “hola” de forma ininterrumpida, todo ello añadido a la circunstancia de que el hilo que escribe, espera a que le llegue una señal event y vuelve a borrar la señal al completar su escritura.
import threading
import time
# Crea un evento
evento = threading.Event()
def hilo_espera(evento):
print(f"{threading.current_thread().name} esperando al evento...")
evento.wait()
print(f"{threading.current_thread().name} el evento ha ocurrido!")
def hilo_disparador(evento):
time.sleep(2)
print(f"{threading.current_thread().name} disparando el evento!")
evento.set()
hilo1 = threading.Thread(name="Hilo 1", target=hilo_espera, args=(evento,))
hilo2 = threading.Thread(name="Hilo 2", target=hilo_disparador, args=(evento,))
hilo1.start()
hilo2.start()
hilo1.join()
hilo2.join()
En este código, Hilo 1 espera a que ocurra un evento, mientras que Hilo 2 dispara el evento después de 2 segundos. El método wait() del objeto Event bloquea el hilo hasta que el evento sea disparado desde otro hilo. En este caso, Hilo 1 se bloquea hasta que Hilo 2 dispara el evento con el método set().
Por lo tanto, Event proporciona una forma de sincronizar hilos: un hilo puede esperar a que ocurra un evento, mientras que otro hilo puede disparar el evento. Esto puede ser útil en situaciones donde un hilo necesita esperar a que otro hilo complete una tarea antes de continuar.
El sincronismo de hilos en Python usando Event
de la biblioteca estándar threading
permite a los hilos coordinar su ejecución en función de señales emitidas por uno o más hilos. El objeto Event
funciona como una bandera que los hilos pueden observar y que puede ser encendida o apagada por otros hilos.
Estado del Event
:
Event
está en estado «no activado» (off). Esto significa que cualquier hilo que llame a wait()
sobre este evento se bloqueará hasta que el evento sea activado.set()
, el evento cambia a estado «activado» (on), permitiendo que todos los hilos que estaban esperando continúen su ejecución.clear()
apaga el evento, devolviéndolo al estado «no activado».is_set()
permite consultar si el evento está activado o no.Coordinación:
wait()
o pueden configurarse con un tiempo máximo de espera.Event
En este ejemplo, varios hilos esperarán hasta que un evento sea activado por el hilo principal.
import threading
import time
# Creamos un objeto Event
evento = threading.Event()
def trabajador(id_trabajador):
print(f"Trabajador {id_trabajador} está esperando el evento...")
# Espera a que el evento sea activado
evento.wait()
print(f"Trabajador {id_trabajador} recibió el evento y está trabajando.")
# Creamos hilos
hilos = [threading.Thread(target=trabajador, args=(i,)) for i in range(5)]
# Iniciamos los hilos
for hilo in hilos:
hilo.start()
# Simulamos una demora en activar el evento
print("El hilo principal está haciendo algo antes de activar el evento...")
time.sleep(3)
print("Activando el evento para que los trabajadores continúen.")
evento.set()
# Esperamos que todos los hilos terminen
for hilo in hilos:
hilo.join()
print("Todos los trabajadores han terminado.")
Crear el objeto Event
:
evento = threading.Event()
.Hilos trabajadores:
evento.wait()
y queda bloqueado esperando que el evento sea activado.Activación del evento:
time.sleep(3)
, el hilo principal llama a evento.set()
. Esto activa el evento y desbloquea a todos los hilos que estaban esperando.Finalización:
Trabajador 0 está esperando el evento...
Trabajador 1 está esperando el evento...
Trabajador 2 está esperando el evento...
Trabajador 3 está esperando el evento...
Trabajador 4 está esperando el evento...
El hilo principal está haciendo algo antes de activar el evento...
Activando el evento para que los trabajadores continúen.
Trabajador 0 recibió el evento y está trabajando.
Trabajador 1 recibió el evento y está trabajando.
Trabajador 2 recibió el evento y está trabajando.
Trabajador 3 recibió el evento y está trabajando.
Trabajador 4 recibió el evento y está trabajando.
Todos los trabajadores han terminado.