Concurrencia Asíncrona (asyncio)
Python es de un solo hilo, pero asyncio permite ejecutar múltiples tareas concurrentemente sin hilos adicionales. Funciona como un restaurante con un solo mesero: mientras espera que la cocina prepare un plato, atiende otra mesa. async def define una coroutine (función asíncrona) y await pausa su ejecución hasta que la operación termine, liberando el hilo para otras tareas.
El event loop es el corazón de asyncio: es un bucle infinito que gestiona las tareas pendientes. asyncio.run() crea y ejecuta el loop. asyncio.gather() ejecuta múltiples coroutines en paralelo. asyncio.create_task() programa una coroutine para ejecución futura. Es ideal para I/O (peticiones HTTP, base de datos, archivos) donde la CPU espera respuestas externas.
import asyncio
import time
# Función asíncrona (coroutine)
async def descargar(url, segundos):
print(f"Descargando {url}...")
await asyncio.sleep(segundos) # Simula I/O
print(f"Listo: {url}")
return f"Datos de {url}"
# SECUENCIAL: 6 segundos total
async def secuencial():
inicio = time.time()
await descargar("api.com/users", 2)
await descargar("api.com/posts", 2)
await descargar("api.com/comments", 2)
print(f"Total: {time.time() - inicio:.1f}s") # ~6s
# CONCURRENTE: 2 segundos total
async def concurrente():
inicio = time.time()
resultados = await asyncio.gather(
descargar("api.com/users", 2),
descargar("api.com/posts", 2),
descargar("api.com/comments", 2),
)
print(f"Total: {time.time() - inicio:.1f}s") # ~2s
print(resultados) # Lista con los 3 resultados
asyncio.run(concurrente())
# Ejemplo real: scraper concurrente
import aiohttp # pip install aiohttp
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.json()
async def scraper():
urls = [f"https://api.ejemplo.com/page/{i}" for i in range(10)]
async with aiohttp.ClientSession() as session:
tareas = [fetch(session, url) for url in urls]
resultados = await asyncio.gather(*tareas)
return resultados # 10 páginas descargadas concurrentemente
Practica esta lección
Resuelve los ejercicios del curso de Python en la app, gratis y con corrección automática.
Empezar a practicar