Générateurs asynchrones en Python

Exploiter Async/Await avec les générateurs pour un code non bloquant

Explorer les générateurs asynchrones en Python et apprendre comment ils s’intègrent à asyncio pour gérer efficacement les opérations d’E/S asynchrones. Comprendre quand utiliser les générateurs asynchrones et voir des exemples pratiques.

Programmation
Auteur·rice
Affiliation
Date de publication

5 février 2024

Modifié

9 mai 2025

Mots clés

Générateurs asynchrones Python, Générateurs asynchrones Python, Tutoriel sur les générateurs asynchrones, Exemple asynchrone en Python, code non bloquant

Introduction

Les générateurs asynchrones sont un outil puissant en Python qui vous permet de produire des éléments de manière asynchrone en utilisant la syntaxe async et await. Ils vous permettent d’itérer sur des flux de données asynchrones sans bloquer votre application, ce qui les rend idéaux pour les tâches liées aux E/S telles que la communication réseau, la lecture de fichiers volumineux ou le traitement de données en temps réel.



Que sont les générateurs asynchrones?

Les générateurs asynchrones sont définis à l’aide de la syntaxe async def et du mot-clé yield. Contrairement aux générateurs ordinaires, les générateurs asynchrones mettent leur exécution en pause lorsqu’ils rencontrent un await énoncé. Cela signifie qu’ils peuvent gérer des opérations asynchrones au sein même de la fonction du générateur, offrant ainsi un moyen non bloquant de produire des données.

Points clés:

  • Exécution non bloquante:
    Ils permettent à la boucle d’événements d’exécuter d’autres tâches en attendant la fin d’une opération d’E/S.
  • Évaluation paresseuse:
    Les valeurs sont générées à la demande, ce qui permet d’économiser de la mémoire et d’améliorer les performances.
  • Intégration avec asyncio:
    Les générateurs asynchrones fonctionnent de manière transparente avec le cadre asyncio de Python, ce qui permet une programmation concurrente efficace.

Exemple de base d’un générateur asynchrone

Voici un exemple simple qui montre comment créer et utiliser un générateur asynchrone en Python:

import asyncio

async def async_counter(n):
    """An asynchronous generator that yields numbers from 1 to n with a delay."""
    for i in range(1, n + 1):
        await asyncio.sleep(0.5)  # Simuler un délai lié aux E/S
        yield i

async def main():
    async for number in async_counter(5):
        print("Count:", number)

if __name__ == "__main__":
    asyncio.run(main())

Explication:
Dans cet exemple, async_counter est un générateur asynchrone qui produit des nombres de 1 à n. Le await asyncio.sleep(0.5) simule une opération asynchrone, permettant à la boucle d’événements de gérer d’autres tâches pendant le délai. La boucle async for de la fonction main itère sur les valeurs produites au fur et à mesure qu’elles sont disponibles.

Quand utiliser les générateurs asynchrones

Les générateurs asynchrones sont particulièrement utiles dans les cas suivants:
- Gestion des opérations liées aux E/S:
Elles sont idéales pour les scénarios dans lesquels les données sont reçues de manière incrémentale au fil du temps, comme la lecture à partir d’un socket réseau ou le traitement d’un fichier volumineux ligne par ligne. - Données en continu:
Lorsqu’il s’agit de flux de données en temps réel, les générateurs asynchrones peuvent produire efficacement des données sans charger l’ensemble du flux en mémoire. - Intégration avec d’autres fonctions asynchrones:
Ils vous permettent de construire des pipelines d’opérations asynchrones, en s’intégrant de manière transparente à d’autres composants asyncio.

Meilleures pratiques et considérations

  • Gestion des erreurs:
    Utilisez les blocs try/except dans les générateurs asynchrones pour attraper et gérer les exceptions de manière élégante.
  • Rester modulaire:
    Décomposez vos tâches asynchrones en générateurs plus petits et composables qui peuvent être enchaînés pour créer des flux de travail complexes.
  • Test du code asynchrone:
    Tirer parti des cadres de test qui prennent en charge le code asynchrone (comme pytest avec pytest-asyncio) pour s’assurer que vos générateurs fonctionnent comme prévu.
  • Documenter votre code:
    Documentez clairement le comportement de vos générateurs asynchrones pour faciliter la maintenance et la compréhension, en particulier lors de l’intégration avec des systèmes asynchrones plus importants.
Astuce

Lorsque vous débutez avec les générateurs asynchrones, expérimentez avec de petits exemples pour vous familiariser avec la syntaxe async/await avant de les intégrer dans des applications plus complexes.

Conclusion

Les générateurs asynchrones offrent une méthode puissante pour gérer efficacement les flux de données asynchrones. En comprenant leurs principes fondamentaux et en les intégrant au framework asyncio de Python, vous pouvez écrire du code non bloquant et économe en mémoire qui s’adapte bien aux applications liées aux E/S. Expérimentez ces concepts pour voir comment ils peuvent transformer votre approche de la programmation asynchrone.

Plus d’informations

Bon codage et bonne exploration de l’efficacité des générateurs asynchrones en Python!

Explorer d’autres articles

Note

Voici d’autres articles de la même catégorie pour vous aider à approfondir le sujet.

placeholder

placeholder
Aucun article correspondant
Retour au sommet

Réutilisation

Citation

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Générateurs asynchrones en Python},
  date = {2024-02-05},
  url = {https://www.datanovia.com/fr/learn/programming/python/advanced/generators/asynchronous-generators.html},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
Kassambara, Alboukadel. 2024. “Générateurs asynchrones en Python.” February 5, 2024. https://www.datanovia.com/fr/learn/programming/python/advanced/generators/asynchronous-generators.html.