import random, asyncio, time async def fetch_posts(user): delay = random.uniform(0.5, 2.0) print(f"Post coroutine : récupération des postes pour l'utilisateur {user["name"]}.") await asyncio.sleep(delay) posts = [f"Post {i} par l'utilisateur {user["name"]}" for i in range (1, 3)] print(f"Post coroutine : récupération de {len(posts)} posts pour l'utilisateur {user["name"]} - delay : {delay:.2f}s.") for post in posts: print(f"--- {post} ---") async def fetch_user(user_id): delay = random.uniform(0.5, 2.0) print(f"Utilisateur coroutine : récupération de l'utilisateur {user_id=}.") # En mettant le = à la fin, il va écrire user_id=[valeur] await asyncio.sleep(delay) user = {"id": user_id, "name": f"User{user_id}"} print(f"Utilisateur coroutine : récupération de l'utilisateur {user_id=} - delay : {delay:.2f}s.") return user async def get_user_with_posts(user_id): user = await fetch_user(user_id) await fetch_posts(user) async def main(): user_ids = [1,2,3] start = time.perf_counter() await asyncio.gather( # liste de compréhension. Dans un tuple, elle donne un "Générateur". # L'étoile fait donner l'instruction pour autant d'éléments que # nécessaire *(get_user_with_posts(user_id) for user_id in user_ids) ) print(f"Temps total d'exécution : {time.perf_counter() - start:.2f}s.") if __name__ == "__main__": random.seed(444) asyncio.run(main())