simpy новичок здесь. Я только начал создавать симулятор динамика-модератора с simpy. Вот мой кодПрерывание условное событие в simpy
import simpy
def speaker(env):
try:
print("Speaker start to talk at: {}".format(env.now))
speak_time = 40
print ("Speaker want to speak for {}".format(speak_time))
yield env.timeout(speak_time)
print ("Speaker finish the talk at: {}".format(env.now))
except simpy.Interrupt as interrupt:
print (interrupt.cause)
def moderator(env):
for i in range(3):
print("Moderator let the speaker number {} to begin the speak".format(i))
speaker_proc = env.process(speaker(env))
print("Time now: {}".format(env.now))
time_limit = env.timeout(30)
results = yield speaker_proc | time_limit
print("Moderator check whether speaker passed the time limit or no")
print("Time limit passed: {}".format (speaker_proc not in results))
if speaker_proc not in results:
print("Time now: {}".format(env.now))
speaker_proc.interrupt()
print ("Moderator stop the talk at: {}".format(env.now))
print()
print()
env = simpy.Environment()
env.process(moderator(env))
env.run()
Когда я запускаю его с speak_time> 30 или speak_time < 30, он не имеет никаких проблем, но если я изменю speak_time в функции динамик стал 30 он получит сообщение об ошибке, как это:
RuntimeError: <Process(speaker) object at 0x9e17930> has terminated and cannot be interrupted.
Что случилось?
После прочтения некоторых примеров, в функции модератора процесса я меняю If-clause «если speaker_proc не в результатах:« станет «если не speaker_proc.triggered:», и он снова стал работать. Тем не менее, не знаю, почему это может снова работать. Я думаю, что снова прочитаю документацию – yusri
Основная проблема заключается в том, что оба тайм-аута, модератор и динамик назначаются одновременно. Но так как они должны быть сериализованы, первая из модераторов get обрабатывается первой. Когда событие условия оценивается, время ожидания модератора уже обрабатывается, но процессы динамиков все еще находятся в очереди. Таким образом, событие состояния знает об этом. Когда модератор возобновляется, динамики обрабатываются. –