Semáforo
Semáforo son una herramienta versátil en programación concurrente, proporcionando mecanismos efectivos para controlar el acceso a recursos compartidos y coordinar la ejecución de hilos, lo que contribuye a la escritura de programas concurrentes seguros y eficientes.
Aquí tienes un ejemplo simple de cómo se pueden utilizar semáforos en Python, utilizando la biblioteca threading
import threading import time # Crear un semáforo binario (inicializado en 1) sem = threading.Semaphore(1) # Variable compartida contador = 0 # Función para incrementar el contador def incrementar(): global contador sem.acquire() # Operación wait try: for _ in range(1000000): contador += 1 finally: sem.release() # Operación signal # Crear dos hilos que incrementan el contador hilo1 = threading.Thread(target=incrementar) hilo2 = threading.Thread(target=incrementar) # Iniciar los hilos hilo1.start() hilo2.start() # Esperar a que ambos hilos terminen hilo1.join() hilo2.join() # Imprimir el valor final del contador print("Valor final del contador:", contador)
En este ejemplo, se crea un semáforo binario (sem
) con un valor inicial de 1. La función incrementar
representa una sección crítica donde se incrementa la variable contador
. Antes de entrar en la sección crítica, se adquiere el semáforo (sem.acquire()
), y después de salir de la sección crítica, se libera el semáforo (sem.release()
).
La operación acquire
actúa como la operación wait
, y release
actúa como la operación signal
. Estas operaciones aseguran que solo un hilo pueda ejecutar la sección crítica a la vez, logrando exclusión mutua y evitando condiciones de carrera.