Module 7: Asyncio and Cooperative Systems

Event Loop, Coroutines, and Tasks

Event Loop, Coroutines, and Tasks

Asyncio uses cooperative scheduling: a coroutine yields control at await points so the event loop can run another ready task. It excels when many operations wait on async-capable IO.

Module: Module 7: Asyncio and Cooperative Systems

Core mental model

This lesson is built around four connected ideas. Read them as a decision framework, then prove each one with the walkthrough.

  • Calling async def creates a coroutine object but does not schedule it.
  • create_task schedules a coroutine and returns a tracked Task.
  • gather awaits a group and preserves input-result order.
  • Async is a coordination model, not a CPU optimization.

Walkthrough

import asyncio

async def fetch(name, delay):
    print("start", name)
    await asyncio.sleep(delay)
    print("done", name)
    return name

async def main():
    results = await asyncio.gather(
        fetch("users", 0.3),
        fetch("orders", 0.1),
        fetch("payments", 0.2),
    )
    print(results)

asyncio.run(main())

All waits overlap, so runtime approaches the longest delay. Completion prints by delay while gather returns results in input order. Real gains require async libraries throughout the waiting path.

Hands-on lab

Implement a simulated API fan-out, measure sequential versus gathered runtime, and add task names so logs can identify each operation.

What to watch for

  • Forgetting await creates an unexecuted coroutine warning.
  • Calling time.sleep blocks the event-loop thread.
  • Creating fire-and-forget tasks without retaining them loses failure visibility.

Engineering checklist

  • Connect the lesson's mental model to the choices made in the walkthrough.
  • Test the normal case, an empty or boundary case, and one invalid case.
  • Keep external input, side effects, and reusable logic in clearly separated layers.
  • Prefer the clearest correct implementation before optimizing or generalizing it.

Completion check

You can implement the lab without copying the example, explain the core concepts in your own words, and show tests or terminal output that demonstrate the expected and failure paths.