3 puntos por GN⁺ 2024-05-09 | Aún no hay comentarios. | Compartir por WhatsApp
  • 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.

Aún no hay comentarios.