如何让进程等待多个资源?

时间:2015-04-30 19:25:29

标签: simulation simpy

我目前正在使用SimPy来模拟和模拟服务器进程,我希望此进程根据从哪里接收此消息来执行不同的操作。

SimPy文档显示了如何等待多个事件: 例如:收益率事件1 |事件2

但是我目前正在尝试等待多个商店提供资源。

方案如下: 服务器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 个答案:

答案 0 :(得分:2)

您必须在每次迭代中创建一个新的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)