Как я могу заставить процесс ждать нескольких ресурсов?
В настоящее время я использую SimPy для моделирования и симуляции серверного процесса, и я хотел бы, чтобы этот процесс выполнял другое действие в зависимости от того, откуда он получает это сообщение.
В документации SimPy показано, как ожидать нескольких событий: Пример: yield event1 | event2
Однако в настоящее время я пытаюсь дождаться, когда ресурс станет доступным из нескольких магазинов.
Сценарий таков: Сервер S ожидает сообщений, которые могут приходить с разных каналов. Каждый из этих каналов может иметь различные функции, которые влияют на время, необходимое для получения сообщения.
Вот код, о котором идет речь:
resources = [inchannel.get() for inchannel in inchannels]
msg = yield simpy.events.AnyOf(env, resources)
где inchannel - это массив магазинов, которые моделируют различные каналы ввода на сервер.
У меня проблема в том, что кажется, что он принимает сообщения только от одного из каналов, какой из них получает первым. Получив первое сообщение, он принимает сообщения с этого канала и игнорирует другие.
Я также попробовал следующее:
resource = inchannel[0].get() | inchannel[1].get() | ...
msg = yield resource
В этом случае он получает только из канала [0]
1 ответ
Вы должны создать новый список событий Get в каждой итерации. Если вы повторно используете старый список, он все равно будет содержать инициированное событие с первой итерации.
Это должно работать:
inchannel = [simpy.Store(env) for i in range(3)]
while True:
# Make a new list of Get events in each iteration
events = [ic.get() for ic in inchannel]
# Wait until (at least) one of them was triggered
res = yield env.any_of(events)
# Cancel all remaining requests, because you will make
# new ones in the next iteration.
# Do this *before* you yield anything
[evt.cancel() for evt in evens]
# Handle all messages (there *might* be more than one)
for msg in res.values():
handle_message(msg)