gather returns results in order. wait returns (done, pending) sets.
1import asyncio23async def slow_task(n):4 await asyncio.sleep(n)5 return n67async def main():8 # gather — returns list of results9 results = await asyncio.gather(10 slow_task(3),11 slow_task(1),12 slow_task(2)13 )14 print(results) # [3, 1, 2] — order preserved1516 # wait — returns done/pending sets17 tasks = [18 asyncio.create_task(slow_task(3)),19 asyncio.create_task(slow_task(1)),20 asyncio.create_task(slow_task(2)),21 ]2223 # FIRST_COMPLETED24 done, pending = await asyncio.wait(25 tasks,26 return_when=asyncio.FIRST_COMPLETED27 )28 print(f"Done: {[t.result() for t in done]}")29 print(f"Pending: {len(pending)}")3031 # ALL_COMPLETED32 done, _ = await asyncio.wait(33 pending,34 return_when=asyncio.ALL_COMPLETED35 )3637asyncio.run(main())
When to use:
gather: simple collection of results.wait: partial results, timeouts, FIRST_COMPLETED.