- Asyncio es una buena forma de manejar programas I/O-bound en Python y, en esencia, ofrece una buena capa sobre los Generators de Python
- Los Generators hacen que el código sea eficiente en memoria y permiten pausar y reanudar funciones usando la palabra clave
yield
- Con
yield from, un generator puede invocar un sub-generator o un objeto iterable, lo que permite crear cadenas de generators
Bucle de eventos
- El núcleo de Asyncio es el event loop, que ejecuta y administra la task actual
- El event loop recorre una lista de tasks y ejecuta cada una con
next(task)
- Durante una operación de I/O, una task usa
yield para pausar su ejecución y devolver el control al event loop
Suspensión
- Con
yield from, se puede agregar un sub-generator a una task
- Si se agrega un generator de sleep, se puede pausar la ejecución de la task hasta el tiempo especificado
- Cuando sleep sale del bucle
while, se produce la excepción StopIteration y el yield from de la función task continúa con la siguiente línea de código
De Yield a Await
- Se puede pasar de
yield a await usando el método dunder __await__ y la palabra clave async
- La palabra clave
await puede invocar el método __await__ de una instancia de clase o usarse sobre una coroutine (objeto creado por una función async)
- La palabra clave
await puede verse como un sinónimo de yield from, con algunas reglas adicionales de validación
- Se puede crear una clase
Task propia, implementar el método __await__ y agregar al event loop la task creada con la función create_task
- El administrador del event loop ejecuta las tasks y, cuando ocurre la excepción
StopIteration, marca la task como completada
- La función sleep también debe modificarse para que sea compatible con async
AsyncIO y Await
- Si en el código anterior se reemplaza "jacobio" por "asyncio", se pasa a usar por completo el paquete asyncio
- Asyncio hace muchas más cosas, pero es posible recrear desde cero sus partes esenciales a partir de generators básicos
- En el paquete asyncio real, se pueden usar funciones como
asyncio.gather() para manejar múltiples tasks
Opinión de GN⁺
- Este artículo explica de forma sencilla cómo funciona asyncio usando generators, por lo que parece de gran ayuda para desarrolladores que se acercan a asyncio por primera vez
- Asyncio es una librería optimizada para el manejo de I/O de alto rendimiento, y entender su estructura interna a través de este artículo puede ayudar a aprovecharla mejor en proyectos reales
- Sin embargo, el asyncio real tiene una estructura mucho más compleja, así que para usarlo en entornos de trabajo probablemente haga falta un aprendizaje más profundo a través de la documentación oficial y otros recursos
- Otras librerías que ofrecen funciones similares a Asyncio son Trio y Curio, y también puede ser interesante comparar sus diferencias
- Al adoptar Asyncio, hay muchos aspectos a considerar, como la compatibilidad con código síncrono existente, el manejo de errores y las pruebas, por lo que será necesaria una revisión y preparación suficientes
Aún no hay comentarios.