Inicio > Cursos > Python > Concurrencia Asíncrona (asyncio)
PythonPython Avanzado y AplicacionesLección 19 de 24

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
Consejo⚡ asyncio NO es multithreading. Es concurrencia cooperativa: las tareas ceden el control con await. Para CPU-bound (cálculos pesados) usa multiprocessing, no asyncio.
← Expresiones RegularesMetaclases y Gestión de Memoria →

Practica esta lección

Resuelve los ejercicios del curso de Python en la app, gratis y con corrección automática.

Empezar a practicar