Python SimPy请求资源指定时长未获取则退出的实现方案咨询
SimPy资源请求超时实现方案
你需要的超时等待逻辑无需自行实现循环,基于SimPy原生的事件竞态特性即可完成,具体方案如下:
核心逻辑
- 发起资源请求后,同时等待「资源分配成功事件」和「指定时长的超时事件」,优先触发哪个事件就执行对应分支
- 超时触发时主动释放资源请求,避免队列残留无效请求占用资源名额,之后直接退出流程不再执行后续操作
完整实现代码
# 超时时长可自定义,单位和仿真环境时间单位保持一致即可,示例设为10秒 REQUEST_TIMEOUT = 10 def customer_process(name, env, cw): print('%s arrives at the carwash at %.2f.' % (name, env.now)) # 发起资源请求 request = cw.machine.request() # 事件竞态:同时等待资源分配和超时,哪个先返回就走哪个逻辑 trigger_event = yield request | env.timeout(REQUEST_TIMEOUT) if request in trigger_event: # 资源分配成功,走正常业务流程 print('%s gets service at %.2f.' % (name, env.now)) # 这里替换为你自己的后续操作逻辑 yield env.timeout(5) print('%s finishes service and leaves at %.2f.' % (name, env.now)) # 资源使用完成后释放 cw.machine.release(request) else: # 超时触发,释放请求后直接退出 cw.machine.release(request) print("客户未获得帮助") return
注意事项
- 无论是否成功拿到资源,都需要调用
release()方法释放请求,否则会导致资源队列出现无效占位,影响后续正常请求的分配 - 如果更习惯用
with语法管理资源,也可以将资源请求放在with块中,退出with块时会自动释放资源,无需手动调用release()
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

