asyncio.Lock y Event: Sincroniza Corrutinas resuelve un problema frecuente en proyectos Python: Protege estado compartido entre tareas y avisa cuando una condición está lista. Esta guía explica el mecanismo, presenta un ejemplo ejecutable y marca los límites que evitan una implementación frágil.

Concepto y caso de uso

Incluso en un event loop, una corrutina puede pausar en await y dejar que otra vea estado intermedio. Lock serializa la sección; Event difunde una señal.

Para repasar los fundamentos relacionados, consulta también la guía de async y await. La integración es más simple cuando cada función recibe dependencias y datos explícitamente en lugar de depender de estado global.

Ejemplo práctico

import asyncio

lock = asyncio.Lock()
ready = asyncio.Event()
balance = 0

async def add(value: int) -> None:
    global balance
    async with lock:
        current = balance
        await asyncio.sleep(0)
        balance = current + value
    ready.set()

Mantén pequeña la sección protegida y usa async with para liberar el lock ante excepciones. Estas primitivas no sincronizan threads.

Decisiones importantes

La elección correcta depende del contrato público, del volumen y del comportamiento ante fallos.

Considera concurrencia, entradas vacías y fallos parciales. Documenta cada límite que afecte a consumidores y usa nombres que expresen intención.

Errores frecuentes

El ejemplo mínimo no sustituye límites, manejo de errores y observabilidad. Hacer I/O lento con el lock reduce concurrencia y puede bloquear. Event no transporta datos y su señal sigue activa hasta clear.

Evita capturar excepciones sin contexto o devolver resultados parciales como si fueran completos. Un fallo explícito suele ser más seguro que datos silenciosamente incorrectos.

Cómo validar

Valida el comportamiento y no solo el camino feliz. Fuerza alternancia con esperas controladas, añade timeout a pruebas y comprueba que una excepción libera el lock.

La documentación oficial, consultada el 28 de julio de 2026, detalla la API y debe ser la referencia para cambios futuros.