🐍 PyTutos

Programmation asynchrone (async / await)

Exécute plusieurs tâches en parallèle sans bloquer avec asyncio.

⏱ 15 minutes 📂 avance #avance #async #asyncio #await

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 def crée une coroutine (pas une fonction normale)
  • await attend qu'une coroutine se termine, en laissant la main aux autres tâches pendant l'attente
  • asyncio.gather(...) exécute plusieurs coroutines en parallèle
  • asyncio.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 faut await coro()
  • Mélanger time.sleep et async : utilise asyncio.sleep
  • asyncio.run dans un Jupyter notebook : déjà dans une boucle, utilise await 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.