Bienvenue dans l'ultime Tutoriel Python AsyncIO! Si vous êtes un programmeur/développeur désireux de maîtriser la programmation asynchrone et de renforcer vos compétences Python, vous êtes au bon endroit.
Dans ce guide, nous approfondirons les tenants et les aboutissants d'asyncio. À la fin du guide, vous aurez compris :
- Qu'est-ce que l'asyncio ?
- Avantages/Cas d'utilisation
- Comment fonctionne asyncio sous le capot
- Comment travailler avec asyncio avec des exemples concrets
- Limites/Conseils de dépannage
Prêt? Allons-y !
Qu'est-ce qu'AsyncIO en Python
AsyncIO est la bibliothèque intégrée de Python pour écrire du code asynchrone à l'aide de async et await mots-clés.
Si vous êtes complètement nouveau dans la programmation asynchrone, il peut être utile de penser à jongler avec plusieurs balles simultanément au lieu d'attendre que chaque balle touche le sol avant d'en ramasser une autre.
la boucle d'événements à thread unique a atterri dans Python 3.4 sous PEP 3156, tout en adoptant également le moderne async/await syntaxe formalisée dans PEP 492, pour montrer comment les coroutines jonglent avec des milliers de tâches liées aux E/S sans bloquer un thread. Une fois que vous aurez compris, vous commencerez à voir la beauté d’écrire du code capable de gérer plusieurs tâches simultanément. Python asyncio vous ouvrira vraiment les yeux sur une manière de coder plus efficace, comme nous l'explorerons tout au long de ce didacticiel.
Pourquoi devriez-vous envisager d'utiliser Python AsyncIO
Python AsyncIO n'est pas seulement un mot à la mode ; cela résout des problèmes du monde réel. Imaginez que votre programme doive attendre des ressources externes, comme télécharger des fichiers, interroger des bases de données ou effectuer des appels d'API.
Sans AsyncIO, ces opérations bloquent l'intégralité de votre programme jusqu'à ce qu'elles soient terminées. Avec AsyncIO, cependant, vous pouvez assurer le bon fonctionnement d’autres parties de votre application en attendant.
Voici une analogie simple : imaginez-vous en train de préparer le dîner. Vous ne resteriez pas les bras croisés pendant que l'eau bout : vous hacheriez des légumes ou prépareriez des épices simultanément. AsyncIO permet à vos programmes de faire exactement cela.
Avantages clés de Python AsyncIO
- Opérations d'E/S efficaces : AsyncIO brille lorsqu'il s'agit d'opérations réseau, d'E/S de fichiers ou de requêtes de base de données. Vous pouvez exécuter plusieurs opérations simultanément sans attendre que chacune se termine individuellement.
- La simplicité plutôt que les fils : Au lieu de jongler avec les threads et de vous soucier des conditions de concurrence, la syntaxe async/wait rend votre code plus linéaire et plus facile à suivre. Croyez-moi, une fois que vous l'aurez utilisé, vous ne voudrez plus jamais y retourner.
- Meilleure gestion des ressources : Avec la programmation asynchrone, vous pouvez gérer des milliers de tâches avec une surcharge minimale. Ceci est particulièrement utile pour les applications Web évolutives.
- Réactivité : Fini les applications gelées ! Votre interface utilisateur reste vive et réactive, même lorsque vous effectuez des tâches lourdes en arrière-plan. Personne n’aime cliquer sur un bouton puis regarder un rouet pendant des heures.
J'ai appris cela de première main lors de la conversion d'un robot d'exploration Web bloquant en un robot asynchrone. L’amélioration des performances a été spectaculaire et m’a fait apprécier l’élégance de cette belle fonctionnalité.
Cas d'utilisation réels de Python AsyncIO
Décomposons quelques avantages et cas d'utilisation pratiques :
- Applications en temps réel : La programmation asynchrone vous permet de gérer en douceur les mises à jour en temps réel, qu'il s'agisse d'applications de chat ou de flux en direct.
- Serveurs à haute concurrence : Construire des serveurs qui gèrent de nombreuses connexions client devient beaucoup plus gérable.
- Web Scraping et appels API : AsyncIO est parfait pour effectuer plusieurs appels API simultanément, réduisant ainsi les temps d'attente et augmentant l'efficacité.
- Applications GUI : Même dans les applications graphiques, la programmation asynchrone empêche l'interface utilisateur de se bloquer lors d'opérations d'E/S lourdes.
- Informatique: Gérer de grands ensembles de données et effectuer des tâches simultanément.
Si vous vous êtes déjà demandé comment les frameworks Web modernes comme FastAPI atteignent une vitesse fulgurante, la réponse réside dans Python AsyncIO.
Astuce 💡 : Explorez des concepts plus avancés en Python pour passer au niveau supérieur !
Comment utiliser AsyncIO en Python
Passons maintenant à un didacticiel pratique pour vous familiariser avec Python asyncio. Je vais vous expliquer un exemple simple montrant comment cela fonctionne et comment l'utiliser pour gérer plusieurs tâches.
Comment fonctionne Python asyncio ?
Chaque programme asyncio commence par une boucle d'événements. Considérez-le comme le chef d'orchestre qui planifie et exécute vos tâches asynchrones.
Boucle d'événement: Le planificateur principal d'AsyncIO qui gère et exécute les coroutines, gère la préparation des E/S et les minuteries pour reprendre chaque coroutine lorsque sa tâche attendue est prête. (Apprendre encore plus)
Commençons par un exemple de code très basique :
async def hello_async():
print("Hello, ")
await asyncio.sleep(1) # Other tasks can execute in the meantime (wait 1 second)
print("AsyncIO!")
if __name__ == "__main__":
asyncio.run(hello_async())Code language: PHP (php)
Dans ce code, le hello_async la coroutine imprime un message, attend une seconde de manière asynchrone (en utilisant await asyncio.sleep(1)), puis imprime un autre message. C'est l'essence même de la programmation asynchrone : attendre sans bloquer d'autres tâches. Pas vraiment époustouflant, mais cela montre les bases.
Coroutine: Une fonction spéciale définie avec async def qui peut suspendre son exécution à await points, permettant à d'autres coroutines de s'exécuter jusqu'à ce que l'opération attendue soit terminée. (Apprendre encore plus)
Voici comment le programme ci-dessus fonctionne étape par étape :
async defNous définissons une coroutine appeléesay_hello():hello_async.await asyncio.sleep(1): C'est ici que la magie opère.asyncio.sleep(1)est un objet « attendu » qui met la coroutine en pause pendant 1 seconde, mais surtout, il ne bloque pas l'intégralité du programme. Python peut faire autre chose en attendant (s'il y avait autre chose à faire).asyncio.run(hello_async()): C'est comme ça qu'en fait tu courir votre code asyncio.asyncio.run()démarre la « boucle d’événements », qui est comme le cerveau de asynciogérant toutes vos coroutines.
Comprendre la boucle d'événements
Voici comment fonctionne le mécanisme de boucle d'événements sous le capot :

Exécuter plusieurs tâches simultanément
Comme nous l'avons mentionné au début de ce didacticiel, la véritable puissance de Python asyncio devient évidente lorsque vous exécutez plusieurs tâches simultanément. Découvrez cet exemple :
import asyncio
async def task(name, duration):
print(f"Task {name} started, will take {duration} seconds.")
await asyncio.sleep(duration)
print(f"Task {name} finished.")
async def main():
# Scheduling multiple tasks concurrently
tasks = [
asyncio.create_task(task("A", 2)),
asyncio.create_task(task("B", 1)),
asyncio.create_task(task("C", 3))
]
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.run(main())Code language: PHP (php)
Remarquez comment les tâches s'exécutent simultanément, mais leurs résultats apparaissent en fonction des temps d'exécution. La tâche B se termine plus rapidement même si elle démarre plus tard !
Exemple Python AsyncIO du monde réel – Un simple grattoir Web
Appliquons ce que nous avons appris pour créer quelque chose de pratique : un simple web scraper utilisant aiohttpune bibliothèque populaire pour les requêtes HTTP asynchrones. (vous devrez courir pip install aiohttp si vous ne l'avez pas déjà installé dans votre environnement Python)
import asyncio
import aiohttp
async def fetch_data(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"https://api.github.com",
"https://www.python.org",
"https://docs.python.org/3/library/asyncio.html"
]
async with aiohttp.ClientSession() as session:
tasks = [asyncio.create_task(fetch_data(session, url)) for url in urls]
responses = await asyncio.gather(*tasks)
for i, response in enumerate(responses):
print(f"Response from URL {i+1}: {len(response)} characters fetched.")
if __name__ == '__main__':
asyncio.run(main())Code language: JavaScript (javascript)
En utilisant aiohttp avec Python asyncio, j'ai pu réduire considérablement le temps d'attente global. Cet extrait est un excellent point de départ pour tous ceux qui cherchent à créer des applications Web asynchrones ou des récupérateurs de données. Pour plus de détails, consultez le documentation aiohttp.
Conseils de dépannage
Même avec tous ses avantages, j'ai commis pas mal d'erreurs avec Python asyncio. Voici quelques conseils de dépannage basés sur mon expérience :
- Impasses : Parfois, les tâches peuvent rester bloquées et s’attendre les unes les autres. Vérifiez toujours les dépendances circulaires dans vos coroutines.
- Gestion des erreurs : Enveloppez votre code asynchrone dans des blocs try/sauf. AsyncIO ne gère pas les erreurs différemment du code synchrone, il est donc crucial de détecter les exceptions.
- Problèmes de boucle d'événement : Évitez d'exécuter plusieurs boucles d'événements simultanément. Si vous utilisez des bibliothèques qui gèrent leurs propres boucles, des conflits peuvent survenir.
- Évitez de mélanger le code de blocage : Ne mélangez jamais les appels bloquants synchrones (comme
time.sleep) avec AsyncIO. Utilisez toujoursasyncio.sleepplutôt. - Coroutines de débogage : Utiliser
asyncio.run()une seule fois par point d’entrée du programme. Pour le débogage, utilisez des outils tels queasyncio.create_task()pour inspecter des tâches individuelles.
Limites d'AsyncIO en Python
Bien que ce didacticiel se montre aussi puissant que Python asyncio, ce n'est pas une solution miracle à tous les problèmes. Voici quelques limitations et éléments à garder à l’esprit :
- Tâches liées au processeur : AsyncIO est idéal pour les tâches liées aux E/S, mais si vous avez des tâches lourdes liées au processeur, vous devrez peut-être les combiner avec du multitraitement ou du threading.
- Prise en charge de la bibliothèque : Toutes les bibliothèques ne sont pas conçues dans un esprit asynchrone. Certaines bibliothèques de blocage peuvent ne pas fonctionner correctement avec asyncio.
- Courbe d'apprentissage : La syntaxe async/wait peut prêter à confusion au début. Il faut du temps pour comprendre les boucles d'événements, les coroutines et les tâches.
- Défis de débogage : Le code asynchrone peut être plus difficile à déboguer en raison de son flux non linéaire. Des outils tels que la journalisation et le mode de débogage intégré d'asyncio sont indispensables.
Ces limitations ne diminuent pas la puissance de Python asyncio. Cela signifie simplement que vous devez l'utiliser dans le bon contexte. Il est important d'évaluer les besoins de votre projet et de choisir le meilleur outil pour le travail.
Remarque importante : Python asyncio est concurrencepas parallélisme dans le vrai sens du terme (dans l'implémentation standard de CPython grâce au GIL de Python). Il s'agit de faire les choses semblent simultanément en basculant efficacement entre les tâches mais en ne les effectuant pas en parallèle sur plusieurs cœurs de processeur (sans effort supplémentaire comme le multitraitement). Pour de nombreuses tâches liées aux E/S, la concurrence est exactement ce dont vous avez besoin, et elle est souvent plus efficace que le véritable parallélisme dans ces cas.
Prochaines étapes
Après avoir expérimenté les bases de Python asyncio, voici quelques étapes suivantes pour continuer votre voyage :
- Plongez en profondeur dans Aiohttp : Si vous êtes intéressé par les applications Web, plongez-vous plus profondément dans aiohttp pour créer des serveurs et des clients Web asynchrones.
- Explorez les modèles avancés : Examinez les modèles tels que producteur-consommateur, récupération simultanée de données et annulation de tâches.
- En savoir plus: Je recommande fortement les documents officiels de Python pour approfondir votre compréhension. La connaissance, c'est le pouvoir !
J'ai toujours trouvé que plus j'en apprenais sur la programmation asynchrone, plus cela devenait amusant. Chaque nouveau projet m'a appris quelque chose d'unique, et je suis sûr que vous vivrez votre propre série de moments « aha » au fur et à mesure de vos expériences.
Derniers mots
Pour conclure ce tutoriel, Python asyncio est un outil révolutionnaire qui simplifie la programmation asynchrone. Il est conçu pour être efficace, simple et évolutif, des qualités que j'ai appris à apprécier après des années de lutte contre le blocage du code. Avec des avantages évidents dans les applications en temps réel, le web scraping et les serveurs simultanés, la programmation asynchrone peut rendre votre code plus rapide et plus réactif.
N'oubliez pas d'expérimenter, de partager vos expériences et n'ayez pas peur de casser un peu les choses : tout cela fait partie du processus d'apprentissage. Je suis ravi que vous plongez dans le monde de la programmation asynchrone Python et que vous expérimentiez le plaisir d'écrire du code propre, efficace et hautement concurrent.
Bonne programmation asynchrone ! 🐍
Vous aimerez peut-être aussi
Découvrez-en davantage sur CodeSamplez.com
Abonnez-vous pour recevoir les derniers articles envoyés à votre adresse e-mail.




