0

私は 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

チャネルの定義には何を作成/使用すればよいですか?

私が得るよりもa を使用する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

しかし、私は上記のように取得する必要があります。ライターは、リーダーが読み取る準備ができるまで待機する必要があります。

4

1 に答える 1

0

あなたが望むことは、組み込みのリソースでは直接可能ではありません。回避策は次のとおりです。

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()beforeを実行すると、次の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

別の方法は、独自のリソース タイプを作成することです。

于 2016-03-25T07:50:51.270 に答える