1) Modelo mental: coroutine + event loop
El event loop coordina tareas cooperativas; cada `await` abre espacio para otras tareas.
Una coroutine no se ejecuta por sí sola: debe ser esperada (`await`) o programada como tarea.
`asyncio.run(...)` crea y gestiona el loop principal para scripts simples.
Si una coroutine llama funciones bloqueantes (por ejemplo `time.sleep`), se rompe la ventaja asíncrona.
import asyncio
async def saludo() -> None:
await asyncio.sleep(0.2)
print('hola async')
asyncio.run(saludo())