import structio async def producer(q: structio.Queue, n: int): for i in range(n): # This will wait until the # queue is emptied by the # consumer await q.put(i) print(f"Produced {i}") await q.put(None) print("Producer done") async def consumer(q: structio.Queue): while True: # Hangs until there is # something on the queue item = await q.get() if item is None: print("Consumer done") break print(f"Consumed {item}") # Simulates some work so the # producer waits before putting # the next value await structio.sleep(1) async def main(q: structio.Queue, n: int): print("Starting consumer and producer") async with structio.create_pool() as ctx: ctx.spawn(producer, q, n) ctx.spawn(consumer, q) print("Bye!") if __name__ == "__main__": queue = structio.Queue(2) # Queue has size limit of 2 structio.run(main, queue, 5)