Bounded Queue
Source and Output
"""Example: bounded queue."""
from asimpy import Environment, Process, Queue
from _util import example
PRODUCE_INTERVAL = 1 # ticks between successive items being produced
CONSUME_DURATION = 3 # ticks to process each item
NUM_ITEMS = 3 # total items the producer creates before stopping
class Producer(Process):
def init(self, queue):
self._queue = queue
async def run(self):
for i in range(NUM_ITEMS):
await self.timeout(PRODUCE_INTERVAL)
self._env.log("producer", f"create item {i}")
await self._queue.put(i)
self._env.log("producer", f"...created item {i}")
class Consumer(Process):
def init(self, queue):
self._queue = queue
async def run(self):
while True:
self._env.log("consumer", "wait for item")
item = await self._queue.get()
self._env.log("consumer", f"start item {item}")
await self.timeout(CONSUME_DURATION)
self._env.log("consumer", f"finish item {item}")
def main():
env = Environment()
queue = Queue(env, capacity=1)
Producer(env, queue)
Consumer(env, queue)
env.run()
return env
if __name__ == "__main__":
example(main)
| time | name | event |
|---|---|---|
| 0 | consumer | wait for item |
| 1 | producer | create item 0 |
| 1 | producer | ...created item 0 |
| 1 | consumer | start item 0 |
| 2 | producer | create item 1 |
| 2 | producer | ...created item 1 |
| 3 | producer | create item 2 |
| 4 | consumer | finish item 0 |
| 4 | consumer | wait for item |
| 4 | consumer | start item 1 |
| 4 | producer | ...created item 2 |
| 7 | consumer | finish item 1 |
| 7 | consumer | wait for item |
| 7 | consumer | start item 2 |
| 10 | consumer | finish item 2 |
| 10 | consumer | wait for item |
Key Points
-
Consumer happens to run first, so it is waiting when the producer creates item 0. That item is delivered immediately, leaving the queue empty.
-
The producer can therefore add item 1 to the queue without waiting, but when it tries to add item 2, the queue is at capacity and the producer blocks.
Check for Understanding
How would the program's behavior change if the queue's capacity was 2?