2015-04-30 7 views
1

В настоящее время я использую SimPy для моделирования и моделирования процесса сервера, и я хотел бы, чтобы этот процесс выполнял другое действие в зависимости от того, откуда он получает это сообщение.Как я могу ждать процесса для нескольких ресурсов?

Документация SimPy показывает, как ждать нескольких событий: Ex: 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 

В этом случае он получает только от inchannel [0]

ответ

1

Вы должны создать новый список Получить событий в каждой итерации. Если вы повторно используете старый список, он все равно будет содержать инициированное событие с первой итерации.

Это должно работать:

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)