如何统计Hold模块的阻塞时长及状态切换次数?
供应链仿真阻塞逻辑与指标计算解决方案
一、阻塞/解除阻塞的事件触发逻辑修正
- 给Wait模块绑定进入事件和离开事件:
- 组件进入Wait后,检查当前Wait容量是否等于最大容量:
- 若满足条件且Hold未处于阻塞状态,调用
hold.block(),记录阻塞开始时间,同时增加阻塞切换计数。
- 若满足条件且Hold未处于阻塞状态,调用
- 组件离开Wait后,检查当前Wait容量是否小于最大容量:
- 若满足条件且Hold处于阻塞状态,调用
hold.unblock(),计算本次阻塞时长并累加。
- 若满足条件且Hold处于阻塞状态,调用
- 组件进入Wait后,检查当前Wait容量是否等于最大容量:
二、两个指标的具体实现
1. Hold模块阻塞总时长计算
- 提前定义全局变量:
total_block_time = 0,block_start_time = -1 - 触发阻塞时:仅当Hold未阻塞时,将
block_start_time设为当前仿真时间time() - 解除阻塞时:若
block_start_time有效(不为-1),执行total_block_time += time() - block_start_time,然后重置block_start_time = -1 - 仿真结束时:若Hold仍处于阻塞状态,需补算从
block_start_time到仿真结束的时长,累加到total_block_time
2. 阻塞状态切换次数计算
- 提前定义全局变量:
block_switch_count = 0,is_blocked = False - 触发阻塞时:若
is_blocked为False,则block_switch_count += 1,并将is_blocked设为True - 解除阻塞时:将
is_blocked设为False
三、常见错误排查
- 重复触发阻塞:未判断Hold当前状态就多次调用
block(),导致计数重复、时长计算混乱,必须增加状态判断。 - 遗漏结束时的阻塞时长:仿真终止时若Hold仍阻塞,这部分时长会丢失,需在仿真结束事件中补充计算。
- 事件绑定错误:确保Wait模块的进入/离开事件正确关联到对应逻辑,避免绑定到其他模块的事件。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

