本文介绍了如何让一个进程等待多个资源?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我当前正在使用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]
接收推荐答案
您必须在每个迭代中创建一个新的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)
这篇关于如何让一个进程等待多个资源?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!