CodeForge

Python de Cero a Experto / Python avanzado

Asyncio: asincronía en Python

Teoría22 min20 XP

Cuando un programa pasa el tiempo ESPERANDO —una respuesta de una API, una lectura de disco, una consulta a una base de datos—, no tiene sentido quedarse congelado sin hacer nada. La programación ASÍNCRONA con asyncio permite manejar muchas de esas esperas CONCURRENTEMENTE: mientras una tarea espera, otras avanzan. Es el mismo concepto de asincronía que dominaste en JavaScript (SC-02), con la sintaxis async/await de Python. Hoy entiendes las bases de asyncio.

El mesero que no se congela

async y await

Como asyncio necesita un bucle de eventos que este entorno del navegador maneja distinto, esta lección muestra el código con bloques —pruébalo en tu Python instalado con python archivo.py—:

asincronia.py
import asyncio

# 'async def' define una función asíncrona (una CORRUTINA)
async def cargar_gasto(id):
  print(f"  pidiendo gasto {id}...")
  await asyncio.sleep(1)          # espera 1s SIN bloquear (simula una API)
  print(f"  gasto {id} listo")
  return {"id": id, "valor": id * 1000}

async def main():
  # await espera a que una corrutina termine
  gasto = await cargar_gasto(1)
  print(gasto)

# asyncio.run arranca el bucle de eventos y ejecuta la corrutina principal
asyncio.run(main())

async def define una CORRUTINA (una función asíncrona). Dentro, await PAUSA la corrutina hasta que algo lento termine (aquí asyncio.sleep, que simula esperar una API) —pero sin BLOQUEAR el programa: mientras espera, el bucle de eventos puede correr otras tareas—. asyncio.run(main()) arranca todo. La sintaxis es casi idéntica a la de JavaScript: async/await, corrutinas que se pausan en los await. La diferencia con una función normal: llamar cargar_gasto(1) no la ejecuta, devuelve una corrutina que debes await.

Concurrencia real: gather

¿Qué ventaja da asyncio.gather frente a esperar tres tareas con await una tras otra?

Mini-reto

Razona (o prueba en tu Python instalado) una versión asíncrona para Mi Bolsillo: 1) una corrutina consultar_precio(producto) que haga await asyncio.sleep(1) y devuelva un precio; 2) una main que consulte TRES productos con asyncio.gather y mida el tiempo total con time.time(); 3) compara mentalmente cuánto tardaría secuencial (con tres await seguidos) vs concurrente. Explica por qué asyncio ayuda con esperas de red pero no con cálculos pesados de CPU.

Qué sigue

¡Módulo 6 conquistado! Dominas el Python avanzado —generadores, decoradores, typing moderno, pattern matching y asyncio—. Ya escribes código pythónico y experto. El reto del módulo junta generadores y decoradores en un pipeline de datos elegante. Después llegan las tres RUTAS especializadas —scripting, backend y datos e IA— donde aplicarás todo esto a proyectos del mundo real.