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

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.

Take asynchronous programming further

Ask the copilot about this term, or have our engineers assess it against your process.