Search code examples
pythonsimpy

wait and collect multiple items at each timestamp from simpy.Store.get()


I am simulating a situation where 1->N number of orders of different types can arrive at each timestamp.

The simpy code:

import simpy
from dataclasses import dataclass
import random

@dataclass
class Order():
    id: int
    type: str

class Simulation:
    def __init__(self, env: simpy.Environment, seed: int):
        self.env = env
        self.order_id = 0
        self.orders_cache = simpy.Store(self.env, capacity=100)
        random.seed(seed)

    def generate_order(self, type: str):
        while True:
            yield self.env.timeout(random.randint(1, 3))
            self.order_id += 1
            order = Order(self.order_id, type)
            self.orders_cache.put(order)
            print(f"Order {self.orders_cache.items} generated at time {self.env.now}")

    def collect_and_add_to_records(self):
        while True:
            yield self.env.timeout(0)
            items = yield self.orders_cache.get()
            print(f"got: {items} at time {self.env.now}")
    
    def run(self):
        types = ['A', 'B']
        for type in types:
            self.env.process(self.generate_order(type))
        self.env.process(self.collect_and_add_to_records())
        self.env.run(until=10)

env = simpy.Environment()
sim = Simulation(env, 10) 
sim.run()

Output:

Order [Order(id=1, type='B')] generated at time 1
got: Order(id=1, type='B') at time 1
Order [Order(id=2, type='A')] generated at time 3
Order [Order(id=2, type='A'), Order(id=3, type='B')] generated at time 3
got: Order(id=2, type='A') at time 3
got: Order(id=3, type='B') at time 3
...

However, simpy.Store.get() seems to retrieve one item at a time, instead of a list of items. Is there a way to get these values together at each timestamp? I've tried appending it a few ways, but haven't been successful.

Expected output:

Order [Order(id=1, type='B')] generated at time 1
got: Order(id=1, type='B') at time 1
Order [Order(id=2, type='A')] generated at time 3
Order [Order(id=2, type='A'), Order(id=3, type='B')] generated at time 3
got: [Order(id=2, type='A'), Order(id=3, type='B')] at time 3
...

Solution

  • could you have done something like

    if key not in aDict:
      aDict[key] = []
    
    aDict[key].append(order)