`asyncio` provides cooperative concurrency: coroutines defined with `async def` voluntarily yield control at `await` points, letting the event loop run other coroutines while waiting on I/O.
python
import asyncio
async def fetch(name, delay):
await asyncio.sleep(delay)
return f"{name} done"
async def main():
results = await asyncio.gather(
fetch("chainA", 1),
fetch("chainB", 0.5),
)
return results
asyncio.run(main())`asyncio.gather` runs coroutines concurrently and collects results in order; unlike threads, only one coroutine actually executes Python code at any instant — concurrency comes from overlapping wait times, not parallel CPU execution.