5.32. async and await

Python has two keywords for writing functions that can pause and resume: async and await. They mirror the generator pattern from the previous page – a function whose body can be suspended and resumed, with local state preserved across the pause – with one change in who drives the resumes.

5.32.1. async def

A function defined with async def is a coroutine function. Calling it does not run the body; it returns a coroutine object that has not started yet:

async def greet(name):
    print("hello,", name)

coro = greet("Alice")        # body NOT run yet

The coroutine object is paused at the very beginning of the function. Something has to drive it to make the body run – that something is an event loop, a runtime component covered by its own future super-section. For now, treat the body as “ready to run, waiting for a driver”.

5.32.2. await

Inside an async def body, the await keyword suspends the coroutine until the awaited value is ready:

async def fetch_and_log():
    data = await read_sensor()
    print("got:", data)

When the body reaches await read_sensor(), the coroutine hands control back to whatever is running it. When read_sensor() finishes, the driver resumes the coroutine on the next line, with the result bound to data.

await is only valid inside an async def body. Using it in a regular function is a syntax error.

5.32.3. Relationship to generators

Coroutines and generators share the same underlying mechanic. The split is who pulls each resume:

  • A generator yields values; the consumer pulls the next one with next() or by iterating.

  • A coroutine yields control; an event loop schedules the resume when the awaited operation is ready.

If the generator-yield handshake from the previous page makes sense, the await handshake is the same idea – just driven by an event loop instead of a for loop.

5.32.4. By themselves

async and await are inert without a runtime to drive them. Defining a coroutine is fine; running one needs an event loop. MicroPython’s asyncio module provides that event loop, and a future super-section covers it in detail. Until then, treat these two keywords as syntax you can read in other people’s code and understand the shape of – without yet needing to write your own concurrent scripts.