3 points par GN⁺ 2024-05-09 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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.

Aucun commentaire pour le moment.