問題を表すコードを示唆して簡略化し、デバッグしようとしました。このランニングからの出力Simpyでリソースが解放されていない - 何が間違っていますか?
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ステートメントをチェックしただけで、それらは決してヒットしません。ロジックはokです。リソースが解放されていないのは不思議です。 – bobo
次に、あなたがバグを打ち負かす最小の例を見つけてみてください。行ごとにコードを削除し、テストします。バグが表示されない場合は、最後の削除を再度挿入し、削除できるものがなくなるまで別の削除を試みます。 –