Programmation asynchrone (async / await)
Exécute plusieurs tâches en parallèle sans bloquer avec asyncio.
Programmation asynchrone
L'async te permet de gérer plusieurs tâches en attente en même temps (requêtes réseau, lectures de fichiers, etc.) sans utiliser de vrais threads.
Sans async : tout bloque
import time
def telecharger(nom):
print(f"⬇️ début {nom}")
time.sleep(2) # simule une attente réseau
print(f"✅ fini {nom}")
debut = time.time()
telecharger("A")
telecharger("B")
telecharger("C")
print(f"Total : {time.time()-debut:.1f}s")
# Total : 6.0s (séquentiel)
Avec async : tout en parallèle
import asyncio
async def telecharger(nom):
print(f"⬇️ début {nom}")
await asyncio.sleep(2) # attente NON bloquante
print(f"✅ fini {nom}")
async def main():
debut = asyncio.get_event_loop().time()
await asyncio.gather(
telecharger("A"),
telecharger("B"),
telecharger("C"),
)
print(f"Total : {asyncio.get_event_loop().time()-debut:.1f}s")
asyncio.run(main())
# Total : 2.0s 🚀
Les concepts
async defcrée une coroutine (pas une fonction normale)awaitattend qu'une coroutine se termine, en laissant la main aux autres tâches pendant l'attenteasyncio.gather(...)exécute plusieurs coroutines en parallèleasyncio.run(coroutine)lance la boucle d'événements
Quand utiliser async ?
✅ Bon :
- requêtes HTTP (avec aiohttp ou httpx)
- attentes (sleep, timers)
- accès BDD asynchrones
- serveurs web modernes (FastAPI)
❌ Mauvais : - calculs lourds (sommes, tri…) → utilise threading/multiprocessing - code 100 % synchrone — l'async ne va PAS l'accélérer
Exemple concret avec aiohttp
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as r:
return await r.text()
async def main():
urls = ["https://example.com", "https://example.org"]
async with aiohttp.ClientSession() as session:
pages = await asyncio.gather(*(fetch(session, u) for u in urls))
for p in pages:
print(len(p), "octets")
asyncio.run(main())
⚠ Pièges classiques
- Oublier
await:coro()ne fait rien, il fautawait coro() - Mélanger
time.sleepet async : utiliseasyncio.sleep✅ asyncio.rundans un Jupyter notebook : déjà dans une boucle, utiliseawait main()directement
💡 L'async demande un peu de pratique mais c'est la façon moderne de faire des programmes qui font 10 choses en même temps sans gaspiller de RAM avec des threads.
🧪 Quiz de validation
Réponds à toutes les questions. Il faut 70% de bonnes réponses pour valider le tuto !
🔒 Tu dois être connecté pour passer le quiz.