Python › Async Generators & Async Context Managers

How do async generators interact with asyncio.Queue to implement a producer-consumer pattern across separate tasks?

Advanced

Answer

A producer task pushes items into an asyncio.Queue with await queue.put(), while a consumer wraps queue.get() in an async generator (looping until a sentinel value signals completion) — decoupling the producer and consumer into independently-scheduled tasks, with the queue providing natural backpressure via its optional maxsize.
async def consume(queue):
    while True:
        item = await queue.get()
        if item is None:  # sentinel signals completion
            break
        yield item

async def producer(queue):
    for i in range(5):
        await queue.put(i)
    await queue.put(None)
Real-world example Decoupling a fast data producer task from a slower consumer task, using a bounded queue to apply backpressure automatically.

Common follow-ups: How does setting a maxsize on the asyncio.Queue create backpressure on the producer?