首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Simpy同步通信信道

Simpy同步通信信道
EN

Stack Overflow用户
提问于 2016-03-24 13:58:09
回答 1查看 286关注 0票数 0

我是个刚开始使用Python和Simpy的新手。我希望在两个进程之间有一个同步通信通道。例如,我希望:

代码语言:javascript
复制
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()

其结果应当是:

代码语言:javascript
复制
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,那么我就会得到(与上面略有不同):

代码语言:javascript
复制
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()

产出如下:

代码语言:javascript
复制
produced 0 at time 0.75
consumed 0 at time 1.2
produced 1 at time 1.5
consumed 1 at time 2.4

但我应该像上面提到的那样。作者应该等到读者准备好阅读为止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-25 07:50:51

您想要的东西不可能直接使用内置资源。解决办法可能有以下几点:

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
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,您将得到:

代码语言:javascript
复制
produced 0 at time 0.75
consumed 0 at time 1.2
produced 1 at time 1.95
consumed 1 at time 2.4

另一种选择是编写自己的资源类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36201953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档