如何在Simpy同一时间戳通过Store.get()批量获取多个订单?
问题:Simpy模拟中实现同一时间戳批量获取订单
我正在模拟每个时间戳有1至N个不同类型订单到达的场景,现有Simpy代码如下:
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()
当前输出:
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 ...
但simpy.Store.get()每次仅获取单个元素而非列表,我希望能在同一时间戳批量获取这些订单,期望输出如下:
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 ...
解决方案
要实现同一时间戳批量获取订单,核心是先等待当前时间戳的所有订单生成完成,再一次性提取缓存中的所有订单。修改后的代码如下:
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) batch = [] # 一次性提取缓存中所有现有订单 while self.orders_cache.items: order = yield self.orders_cache.get() batch.append(order) if batch: print(f"got: {batch} 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()
关键改动说明
yield self.env.timeout(0):Simpy中timeout(0)会让当前进程暂停,优先执行同一时间戳的其他事件(如订单生成),确保当前时间点的所有订单都已存入缓存。- 循环提取缓存:通过
while self.orders_cache.items判断缓存状态,一次性提取所有订单存入列表后统一输出,实现批量获取效果。
运行修改后的代码,即可得到期望的批量输出结果。
内容的提问来源于stack exchange,提问作者Hud
相关产品推荐
相关产品推荐

