A coroutine is a function-like unit that can pause at an `await` point and resume later, letting other tasks run while it waits. With asyncio, an event loop manages these tasks—useful when an application spends more time waiting for language-model responses than processing data. section 7.5.1
Listing 7.17 asyncio example
import asyncio
import time
async def func1():
print("Start func1")
await asyncio.sleep(5)
print("End func1")
return "func1 complete"
async def func2():
print("Start func2")
await asyncio.sleep(3)
print("End func2")
return "func2 complete"
async def main():
start_time = time.time()
co_routines = asyncio.gather(func1(), func2())
a, b = await co_routines
print(a, b)
end_time = time.time()
print("time", end_time-start_time)
asyncio.run(main())
See two coroutines wait for different durations, run together with `asyncio.gather`, and return results with elapsed time measured. section 7.5.1







