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

Simpy仿真异常:已触发的进程未返回问题排查

SimPy排队系统无响应问题排查要点
  • 事件实例不匹配
    检查Queue监听的self.inputs事件集合,是否和InputProcess生成的事件是同一个实例。如果InputProcess每次生成独立事件却未加入Queue的共享事件列表,AnyOf永远无法触发。正确逻辑是:InputProcess生成顾客时,创建事件并添加到Queue维护的inputs列表中,而非生成孤立事件。

  • AnyOf绑定的集合未动态更新
    AnyOf在创建时会绑定当前的事件集合,后续self.inputs的变化不会自动同步到已创建的AnyOf实例。如果Queue的listen进程一开始监听空列表,之后InputProcess添加事件,原AnyOf不会感知到新事件。解决方法是在循环监听中每次重新创建AnyOf,确保监听最新的事件集合。

  • 事件未正确触发
    确认InputProcess生成顾客时是否完成了事件激活:

    • 如果用simpy.Event,需调用event.succeed()来触发事件;
    • 如果用timeout事件,需确保该事件被关联到共享列表中。
      错误示例:仅创建事件但不激活,导致Queue监听的事件永远处于未完成状态。
  • 已处理事件未从集合移除
    AnyOf触发后,已完成的事件会留在self.inputs中。如果未手动移除,下次监听时AnyOf会直接触发已完成的事件,可能导致逻辑混乱;若集合中全是已完成事件,也会影响新事件的监听。需在处理完事件后,从self.inputs中删除对应事件实例。

  • 错误的循环监听逻辑
    正确的监听循环应动态更新事件集合,示例代码:

    def listen(self):
        while True:
            # 空队列时短暂等待,避免空耗
            if not self.inputs:
                yield self.env.timeout(0.1)
                continue
            # 每次循环创建新的AnyOf,监听最新的事件列表
            done_events, _ = yield simpy.events.AnyOf(self.env, self.inputs)
            # 处理每个完成的事件
            for event in done_events:
                self.handle_customer(event.value)
                self.inputs.remove(event)
    

内容的提问来源于stack exchange,提问作者Andry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:42:18