我是个刚开始使用Python和Simpy的新手。我希望在两个进程之间有一个同步通信通道。例如,我希望:
channel = ...
def writer(env):
for i in range(2):
yield env.timeout(0.75)
yield channel.put(i)
print("produced {} at time {}".format(i, env.now))
def reader(env):
while (True):
yield env.timeout(1.2)
i = yield channel.get()
print("consumed {} at time {}".format(i, env.now))
env = simpy.Environment()
env.process(writer(env))
env.process(reader(env))
env.run()其结果应当是:
produced 0 at time 1.2
consumed 0 at time 1.2
produced 1 at time 2.4
consumed 1 at time 2.4我应该做什么/使用什么来定义频道?
如果我使用的是Store,那么我就会得到(与上面略有不同):
import simpy
env = simpy.Environment()
channel = simpy.Store(env)
def writer():
for i in range(2):
yield env.timeout(0.75)
yield channel.put(i)
print("produced {} at time {}".format(i, env.now))
def reader():
while (True):
yield env.timeout(1.2)
i = yield channel.get()
print("consumed {} at time {}".format(i, env.now))
env.process(writer())
env.process(reader())
env.run()产出如下:
produced 0 at time 0.75
consumed 0 at time 1.2
produced 1 at time 1.5
consumed 1 at time 2.4但我应该像上面提到的那样。作者应该等到读者准备好阅读为止。
发布于 2016-03-25 07:50:51
您想要的东西不可能直接使用内置资源。解决办法可能有以下几点:
import collections
import simpy
Message = collections.namedtuple('Message', 'received, value')
def writer(env, channel):
for i in range(2):
yield env.timeout(0.75)
msg = Message(env.event(), i)
yield channel.put(msg)
yield msg.received
print("produced {} at time {}".format(i, env.now))
def reader(env, channel):
while (True):
yield env.timeout(1.2)
msg = yield channel.get()
msg.received.succeed()
print("consumed {} at time {}".format(msg.value, env.now))
env = simpy.Environment()
channel = simpy.Store(env, capacity=1)
env.process(writer(env, channel))
env.process(reader(env, channel))
env.run()输出:
consumed 0 at time 1.2
produced 0 at time 1.2
consumed 1 at time 2.4
produced 1 at time 2.4如果在print()之前执行yield msg.received,您将得到:
produced 0 at time 0.75
consumed 0 at time 1.2
produced 1 at time 1.95
consumed 1 at time 2.4另一种选择是编写自己的资源类型。
https://stackoverflow.com/questions/36201953
复制相似问题