asyncio est une bonne manière de gérer des programmes I/O-bound en Python, et fournit essentiellement une bonne couche au-dessus des generators Python
- Les generators rendent le code plus efficace en mémoire et permettent de suspendre puis de reprendre une fonction à l’aide du mot-clé
yield
- Avec
yield from, un generator peut appeler un sous-generator ou un objet itérable, ce qui permet de créer une chaîne de generators
Boucle d’événements
- Le cœur d’
asyncio est la boucle d’événements, qui exécute et gère la task courante
- La boucle d’événements parcourt une liste de tasks et exécute chacune avec
next(task)
- Lors d’une opération d’I/O, une task utilise
yield pour suspendre son exécution et rendre le contrôle à la boucle d’événements
Mise en veille
yield from permet d’ajouter un sous-generator à une task
- En ajoutant un generator de veille, on peut suspendre l’exécution d’une task jusqu’au moment spécifié
- Quand la veille sort de la boucle
while, une exception StopIteration est levée, et le yield from dans la fonction de task passe à la ligne de code suivante
De yield à await
- On peut passer de
yield à await grâce à la méthode dunder __await__ et au mot-clé async
- Le mot-clé
await peut appeler la méthode __await__ d’une instance de classe, ou être utilisé sur une coroutine (objet créé par une fonction async)
- Le mot-clé
await peut être vu comme un synonyme de yield from, avec quelques règles de validation supplémentaires
- On crée sa propre classe
Task, on y implémente la méthode __await__, puis on ajoute à la boucle d’événements les tasks créées via la fonction create_task
- Le gestionnaire de la boucle d’événements exécute les tasks et les marque comme terminées lorsqu’une exception
StopIteration survient
- La fonction de veille doit elle aussi être modifiée pour être compatible avec
async
AsyncIO et await
- Dans le code ci-dessus, remplacer « jacobio » par « asyncio » permet d’utiliser entièrement le package
asyncio
asyncio fait bien plus de choses, mais il est possible de recréer depuis zéro ses éléments essentiels à partir des generators de base
- Dans le package
asyncio réel, on peut utiliser des fonctions comme asyncio.gather() pour gérer plusieurs tasks
L’avis de GN⁺
- Cet article explique simplement le fonctionnement d’
asyncio à l’aide des generators, ce qui sera très utile aux développeurs qui le découvrent
asyncio est une bibliothèque optimisée pour le traitement I/O haute performance, et comprendre sa structure interne grâce à cet article peut aider à l’utiliser plus efficacement dans de vrais projets
- Cela dit,
asyncio réel possède une architecture bien plus complexe ; pour l’utiliser en production, un apprentissage plus approfondi via la documentation officielle et d’autres ressources sera sans doute nécessaire
- Parmi les autres bibliothèques offrant des fonctionnalités similaires à
asyncio, on trouve Trio et Curio ; comparer leurs différences peut aussi être intéressant
- Lorsqu’on adopte
asyncio, il faut prendre en compte de nombreux aspects comme la compatibilité avec le code synchrone existant, la gestion des erreurs et les tests ; une préparation et une évaluation suffisantes sont donc nécessaires
Aucun commentaire pour le moment.