Как я могу заставить процесс ждать нескольких ресурсов?

В настоящее время я использую 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)
Другие вопросы по тегам