【问题标题】:Simpy synchronous communication channelSimpy 同步通信通道
【发布时间】:2016-03-24 13:58:09
【问题描述】:

我是一个开始使用 Python 和 Simpy 的新手。我想在 2 个进程之间有一个 同步 通信通道。例如我想要:

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

但我应该得到上面提到的。作者应该等到读者准备好阅读。

【问题讨论】:

    标签: simpy


    【解决方案1】:

    使用内置资源无法直接实现您想要的。解决方法可能如下:

    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
    

    如果你在yield msg.received 之前执行print(),你会得到:

    produced 0 at time 0.75
    consumed 0 at time 1.2
    produced 1 at time 1.95
    consumed 1 at time 2.4
    

    另一种方法是编写自己的资源类型。

    【讨论】:

    • 非常感谢您的回答。但是读写器进程都应该互相等待。这不会发生比,对吧?我猜作者会继续写,尽管它应该等到读者准备好阅读。
    • 非常感谢。基本上这就是我需要的。我现在将考虑编写自己的资源类型。但首先我必须了解更多关于 Simpy 和一般 Python 的知识。如果您对我需要的资源类型有任何建议,我们将不胜感激。
    • 我会继续使用它,直到您对 Python 和 SimPy 感到更加舒适和熟悉为止。然后,我会写一个 Store 的子类来做你想要的。另外,阅读所有 SimPy 文档。 ;-)
    猜你喜欢
    • 2017-05-21
    • 2011-02-11
    • 2021-08-20
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2013-05-21
    • 2019-01-14
    • 2017-01-28
    相关资源
    最近更新 更多