Skip to content

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

  1. Consumer happens to run first, so it is waiting when the producer creates item 0. That item is delivered immediately, leaving the queue empty.

  2. 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?