The event loop, honestly
await means "park me, run someone else"
Module 24 introduced async def for I/O-bound work. Here's the part that matters once real traffic hits your API: FastAPI runs on one event loop, on one thread. Every async def route in your app shares that single loop. await is the one moment a coroutine can step aside and let the loop run a different request while it waits โ for a database reply, an HTTP call, anything I/O-bound.
That only works if the thing you're awaiting actually yields control. Call something that blocks โ time.sleep(1), the plain requests library, a tight CPU loop โ inside an async def route, and it does not yield. It freezes the whole loop for that entire second. Every other request queued behind it, on every other connection, waits too. One slow blocking call in one route degrades the whole server, not just that request.