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

如何在Simpy中打印事件及事件队列并生成带时间戳的仿真日志

SimPy 仿真日志记录与事件队列打印实现方案

1. 带时间戳的全仿真事件日志实现

两种常用实现方式,按需选择:

1.1 轻量自定义日志函数

适合小型仿真项目,无需引入额外模块:

  • 核心逻辑:调用日志函数时传入仿真环境对象env,直接读取env.now获取当前仿真时间戳,写入日志文件即可
    代码示例:
import simpy

# 初始化日志文件,写入表头
with open("simulation.log", "w", encoding="utf-8") as f:
    f.write("仿真时间,事件描述\n")

def sim_log(env: simpy.Environment, msg: str):
    """写入带时间戳的仿真日志"""
    log_line = f"{env.now},{msg}\n"
    with open("simulation.log", "a", encoding="utf-8") as f:
        f.write(log_line)
    # 可选同步打印到控制台
    print(f"[{env.now}] {msg}")

# 仿真进程示例
def sample_process(env: simpy.Environment):
    sim_log(env, "进程启动")
    yield env.timeout(5)
    sim_log(env, "等待5s后执行完成")
    yield env.timeout(3)
    sim_log(env, "进程结束")

# 运行仿真
env = simpy.Environment()
env.process(sample_process(env))
env.run()

1.2 结合Python标准logging模块

适合大型仿真项目,支持日志分级、自动落盘等高级特性:

  • 核心逻辑:给logging添加自定义过滤器,将仿真时间注入日志格式中,调用时直接使用标准logging接口即可

2. 事件与事件队列打印实现

SimPy的事件队列存储在环境对象的_queue私有属性中,每个事件对象自带可读的序列化方法,直接打印即可:

  • 打印单个事件:直接print(事件对象)即可输出事件类型、触发时间、关联进程等信息
  • 打印当前全事件队列:遍历env._queue即可输出队列中所有待触发的事件
    示例监控进程代码:
def queue_monitor(env: simpy.Environment, interval: int = 1):
    """每隔固定时间打印当前事件队列内容"""
    while True:
        sim_log(env, "当前事件队列内容:")
        for idx, event in enumerate(env._queue):
            sim_log(env, f"  队列位置{idx}:{event}")
        yield env.timeout(interval)

# 启动仿真时添加监控进程
env.process(queue_monitor(env, interval=2))

注意:_queue是SimPy的内部私有属性,不同版本的属性名可能存在差异,SimPy 3.x/4.x稳定版本均支持该属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:36:04