【发布时间】:2016-09-08 16:25:02
【问题描述】:
我已按照建议简化了代表问题的代码并尝试调试。
这是仍然包含错误的最简单的代码版本:
import simpy
SIM_TIME = 5
def source(env):
i = 0
while True:
i += 1
env.process(train(env, 'Train %d' % i, 'a'))
yield env.timeout(1)
i += 1
env.process(train(env, 'Train %d' % i, 'b'))
yield env.timeout(1)
def train(env, name, route):
resource_req = resource.request()
p3_req = p3.request()
if route == 'a':
print 'Route a %s generated' % name
yield resource_req
print 'Route a %s seized resource at time %d' % (name, env.now)
yield env.timeout(1)
resource.release(resource_req)
print 'Route a %s released resource at time %d' % (name, env.now)
elif route == 'b':
print 'Route b %s generated' % name
yield p3_req
print 'Route b %s seized resource at time %d' % (name, env.now)
yield env.timeout(1)
p3.release(p3_req)
print 'Route b %s released resource at time %d' % (name, env.now)
else:
print 'Could not find a route branch'
env = simpy.Environment()
resource = simpy.Resource(env, 1)
p3 = simpy.Resource(env, 1)
env.process(source(env))
env.run(until=SIM_TIME)
运行的输出:
Route a Train 1 generated
Route a Train 1 seized resource at time 0
Route b Train 2 generated
Route a Train 1 released resource at time 1
Route a Train 3 generated
Route b Train 4 generated
Route a Train 5 generated
如您所见,资源显然已在“路线 a”上释放,但随后无法在路线 a 或路线 b 上占用其他资源。
我对此感到非常困惑。任何帮助将不胜感激!
【问题讨论】:
-
您是否尝试过打印一条消息来检查您是否点击过
else分支(您遗漏的那个)?如果你击中它,你就不会释放资源。 -
是的,刚刚检查了两条路线的 else 语句,它们从未被命中 - 逻辑没问题。奇怪的是资源没有被释放。
-
那么请尝试找到一个最小的示例来解决您遇到的错误。逐行删除代码并进行测试。如果错误没有出现,请重新插入上次删除的内容并尝试删除其他内容,直到没有其他内容可以删除。
-
感谢 Stefan,我已经尽可能地减少了问题,同时仍然包含错误。由于某种原因,在第一个资源被释放后,就无法获取任何资源。
-
@StefanScherfke,我在下面的解决方案中添加了我认为是最小的工作示例。我认为这解释了这个问题,我想知道您对最正确解决方案的看法是什么。