如何在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
相关产品推荐
相关产品推荐

