import aiosched async def producer(q: aiosched.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: aiosched.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 aiosched.sleep(1) async def main(q: aiosched.Queue, n: int): print("Starting consumer and producer") async with aiosched.with_context() as ctx: await ctx.spawn(producer, q, n) await ctx.spawn(consumer, q) print("Bye!") if __name__ == "__main__": queue = aiosched.Queue(2) # Queue has size limit of 2 aiosched.run(main, queue, 5, debugger=None)