You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:33:19