Contenido del curso

Fundamentos de Programación y Python

Programación Orientada a Objetos en Python

Asincronismo en Python con asyncio

Resumen

El asincronismo en Python te permite ejecutar varias tareas al mismo tiempo sin que tu programa se quede esperando. Aprenderás a usar asyncio, corrutinas, async y await para acortar tiempos de procesamiento y responder a los usuarios de forma más eficiente. Es ideal si trabajas con APIs, bases de datos o servidores que tardan en responder.

¿Qué diferencia hay entre sincronismo y asincronismo?

Cuando trabajas de forma sincrónica, envías una petición al servidor, esperas la respuesta y recién entonces puedes enviar la siguiente. Es un flujo lineal que bloquea el programa mientras espera.

Con asincronismo, en cambio, puedes enviar múltiples tareas al mismo tiempo. El servidor las procesa y devuelve las respuestas dentro del mismo tiempo de ejecución. Y aquí viene lo interesante: mientras una tarea está pausada esperando, otras pueden avanzar.

¿Cuándo conviene usar asincronismo? Cuando tu programa depende de respuestas externas como servidores, APIs o bases de datos. Así evitas que una tarea lenta bloquee a las demás.

¿Qué son las corrutinas y cómo funcionan con async y await?

En Python, el asincronismo se apoya en las corrutinas, que son funciones que pueden ser pausadas y luego retomadas. Esa pausa es lo que permite que otras tareas se ejecuten mientras una espera.

Para declararlas, usas dos palabras reservadas:

  • async: define que una función es asíncrona, es decir, una corrutina.
  • await: marca el punto donde la corrutina se pausa hasta que termine la operación que está esperando.

La librería que orquesta todo esto es asyncio, encargada de crear un event loop que recibe los procesos, los administra y devuelve la respuesta de cada tarea.

¿Cómo implementar asyncio paso a paso en Python?

Vamos a construir un ejemplo donde simulamos el procesamiento de un archivo. Primero, importas la librería y defines tu primera corrutina [00:54].

Definir la corrutina que procesa datos

python import asyncio

async def process_data(data): print(f"Procesando {data}...") await asyncio.sleep(10) print(f"{data} ya terminó de procesarse") return data * 2

Aquí pasan varias cosas clave. La función está marcada con async, lo que la convierte en corrutina. Dentro usamos await asyncio.sleep(10) para simular una operación que tarda 10 segundos sin bloquear el event loop [01:48]. Y al final retornamos el dato multiplicado por dos.

¿Qué hace exactamente await? Pausa la corrutina en ese punto, libera el event loop para que otras tareas avancen y retoma la ejecución cuando la operación termina.

Crear la función principal y arrancar el event loop

Ahora necesitas una corrutina principal que coordine las llamadas:

python async def main(): print("Inicio de procesamiento") resultado = await process_data("archivo.txt") print(f"Procesamiento terminado: {resultado}")

asyncio.run(main())

La función main también es asíncrona y desde ahí llamas a process_data. Para iniciar todo, usas asyncio.run(main()), que arranca el event loop y ejecuta las corrutinas [03:30].

¿Qué hace el event loop al ejecutar las corrutinas?

El event loop es el motor que coordina toda la asincronía. Cuando lanzas asyncio.run, el ciclo arranca con el primer request y administra cada corrutina hasta que devuelve su resultado.

En el ejemplo, el flujo es así:

  1. Inicia el procesamiento del archivo TXT.
  2. La corrutina se pausa 10 segundos por el await asyncio.sleep.
  3. Durante esa pausa, otras corrutinas podrían ejecutarse.
  4. Al terminar, el event loop devuelve el resultado y muestra el mensaje final.

En este ejercicio simulamos el tiempo de espera, pero en proyectos reales esa pausa la define el servidor, la API o la base de datos que estés consultando.

Reto: gestor de descarga de archivos con tiempos aleatorios

Para afianzar lo aprendido, crea un sistema de gestión de descargas donde cada archivo tenga un tiempo de procesamiento diferente y aleatorio. En el ejemplo de la clase fijamos 10 segundos manualmente; ahora la idea es que uses valores variables para simular descargas reales.

Algunas pistas para resolverlo:

  • Usa el módulo random para generar tiempos distintos por archivo.
  • Define una corrutina por descarga y lánzalas en paralelo desde main.
  • Observa cómo el event loop maneja varias corrutinas pausadas al mismo tiempo.

Dominar el asincronismo te ayudará a construir proyectos más eficientes, porque puedes pausar una tarea mientras esperas una respuesta y aprovechar ese tiempo para ejecutar otras. ¿Qué tipo de proyecto te gustaría optimizar con asyncio? Cuéntame en los comentarios.