Programación asíncrona en Python con AsyncIO para operaciones I/O

Clase 12 de 17Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI

Resumen

La programación asíncrona en Python te permite atender múltiples tareas sin bloquear el hilo principal, ideal para acelerar esperas de red, archivos o bases de datos. Aquí verás, con claridad y foco práctico, cómo funcionan corrutinas, futures, tareas y el event loop en AsyncIO, y por qué este enfoque mejora el rendimiento en escenarios como consultas simultáneas a News API y The Guardian dentro de Platinus.

¿Qué diferencia hay entre asincronía, concurrencia y paralelismo?

La asincronía busca eficiencia cuando hay esperas. La concurrencia permite que varias tareas avancen a la vez sin ejecutarse literalmente al mismo tiempo. El paralelismo ejecuta varias tareas al mismo tiempo en distintos núcleos de CPU.

  • Asincronía: ideal para operaciones de entrada/salida (I/O) como llamadas a APIs, archivos, bases de datos y red. Evita bloqueos mientras esperas respuestas externas.
  • Concurrencia: múltiples tareas progresan de forma intercalada. Optimiza el uso del tiempo de espera.
  • Paralelismo: acelera cargas intensivas de CPU ejecutando en varios núcleos simultáneamente.

¿Cuándo usar programación asíncrona para I/O y paralelismo para CPU?

  • Usa asincronía cuando el cuello de botella es esperar: APIs web, archivos, red o bases de datos.
  • Usa paralelismo cuando el cuello de botella es cálculo intensivo en CPU.

¿Cómo funciona AsyncIO con corrutinas, futures, tareas y event loop?

AsyncIO es la librería estándar para código asíncrono en Python. Su motor, el event loop, coordina pausas y reanudaciones para que las tareas avancen sin bloquear el hilo principal.

¿Qué es una corrutina y cómo se pausa con await?

Una corrutina es una función declarada con el prefijo async. Puede pausarse con await y reanudar su ejecución más tarde. Al llamarla, retorna una corrutina pendiente de ejecutar.

import asyncio

async def operar_io():
    # Pausa la corrutina durante 1 segundo (simula una espera de I/O).
    await asyncio.sleep(1)

coro = operar_io()  # Retorna una corrutina que puede ser ejecutada más adelante.
  • Palabras clave: async, await, corrutina.
  • Idea clave: una corrutina “espera por algo” sin bloquear el hilo principal.

¿Qué es un future y qué estados maneja?

Un future es “una caja” donde llegará un resultado.

  • Puede estar pendiente, terminada o con error.
  • Al hacer await sobre un future, la corrutina se pausa hasta que el resultado esté listo.

¿Qué es una tarea y qué hace el event loop?

Una tarea empaqueta la corrutina para que el event loop la administre de forma concurrente.

  • El event loop revisa estados, pausa y reanuda corrutinas y tareas en el momento adecuado.
  • Sin event loop, nada avanza: es el motor de AsyncIO.

¿Dónde aporta valor en Platinus y en llamadas a APIs?

La asincronía permite consultar múltiples fuentes a la vez. En Platinus, esto significa preguntar a News API, The Guardian y otras fuentes en paralelo lógico, reduciendo el tiempo total de respuesta al no esperar cada llamada de forma secuencial.

  • Casos de uso ideales: llamadas a APIs web. Lectura y escritura de archivos. Consultas a bases de datos. Operaciones de red.
  • Beneficio práctico: menos tiempo de espera total al superponer esperas externas.

¿Qué reto práctico puedes abordar ahora?

  • Identifica en el código actual las secciones que esperan respuestas externas.
  • Prioriza APIs, archivos, bases de datos y red para convertirlas a asincronía.
  • Empaqueta corrutinas en tareas y deja que el event loop gestione la concurrencia.

¿Dónde aplicarías asincronía primero en Platinus? Comparte tus ideas y análisis en los comentarios.