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
...
could you have done something like
if key not in aDict:
aDict[key] = []
aDict[key].append(order)