Python › Async Generators & Async Context Managers

How do you handle backpressure when an async generator produces items faster than the consumer can process them?

Advanced

Answer

Since 'async for' inherently pauses the PRODUCER (the generator's execution) at each yield until the consumer calls __anext__() again, async generators are naturally backpressure-aware — the producer literally cannot get ahead of the consumer, unlike a callback-based push model where you'd need an explicit buffer or queue.
async def slow_consumer(source):
    async for item in source:
        await asyncio.sleep(1)  # slow processing
        process(item)
        # the producer naturally waits here until we call __anext__ again
Real-world example Processing a fast-arriving async data stream (like a websocket feed) without needing to manually implement a bounded buffer or queue.

Common follow-ups: How would you add EXPLICIT buffering on top of this if you wanted the producer to run ahead by a controlled amount?