Programación asíncrona en Python con AsyncIO para operaciones I/O
Clase 12 de 17 • Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI
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.