asyncio.wait provides finer control over task execution than gather.
1import asyncio23async def slow_task(n):4 await asyncio.sleep(n)5 return n67async def main():8 tasks = [9 asyncio.create_task(slow_task(1)),10 asyncio.create_task(slow_task(3)),11 asyncio.create_task(slow_task(2)),12 ]1314 # FIRST_COMPLETED — return as soon as one finishes15 done, pending = await asyncio.wait(16 tasks, return_when=asyncio.FIRST_COMPLETED17 )18 for task in done:19 print(f"Done: {task.result()}")2021 # FIRST_EXCEPTION — return on first exception22 # ALL_COMPLETED — wait for all2324asyncio.run(main())
Return modes:
FIRST_COMPLETED — any task finishes.FIRST_EXCEPTION — first exception raised.ALL_COMPLETED — all tasks done.vs gather:
wait returns (done, pending) sets.gather returns results list.wait when you need partial results.