asynchronous programming
**Asynchronous Programming** — a concurrency model where tasks can be suspended while waiting for I/O operations (network, disk, timers) and resumed later, enabling efficient handling of thousands of concurrent operations with minimal threads.
**Sync vs Async**
```
Synchronous (blocking): Asynchronous (non-blocking):
Task1: [work][wait---][work] Task1: [work] [work]
Task2: [work] Task2: [work] [work]
Task3: [w] Task3: [work]
↑ switch during waits
```
**async/await Pattern**
```python
async def fetch_data(url):
response = await http_client.get(url) # suspends here, runs other tasks
data = await response.json() # suspends again
return data
# Run multiple fetches concurrently:
results = await asyncio.gather(
fetch_data(url1), fetch_data(url2), fetch_data(url3)
)
```
**Event Loop**
- Central scheduler that runs async tasks
- When a task hits `await`: Task suspends, event loop picks next ready task
- When I/O completes: Task becomes ready again, event loop resumes it
- Single-threaded! No locks needed for shared state
**Use Cases**
- Web servers handling 10K+ concurrent connections (Node.js, FastAPI)
- Database queries (don't block while waiting for DB response)
- Microservices calling other services
- Any I/O-bound workload with many concurrent operations
**NOT useful for**: CPU-bound computation (use threads/processes or parallelism instead)
**Async programming** is essential for building scalable I/O-bound applications — it's why Node.js and Python asyncio can handle massive concurrency.