2016-03-24 23 views
0

私はPythonとSimpyを使い始めた初心者です。私は 2つのプロセスの間の通信チャネルを同期させたいと思います。例えば、私が持っているしたいと思います: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 

をしかし、前述したように、私が取得する必要があります。ライターは、読み取り準備が整うまで待つ必要があります。

答えて

0

組み込みのリソースでは、直接実行することはできません。あなたがyield msg.receivedprint()を行う場合は、あなたが買ってあげる

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

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

選択肢があなたを書くことであろう

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() 

出力:この問題を回避するには、以下のかもしれません独自のリソースタイプ。

+0

お返事ありがとうございました。しかし、読者と作家のプロセスはお互いに待つべきです。これ以上は起こりませんよね?私は、読者が読む準備が整うまで待つべきだが、作家は続けるだろうと思う。 –

+0

ありがとうございます。基本的にこれは私が必要なものです。私は今自分のリソースタイプを書くことを考えます。しかし、まずSimpyとPythonについて一般的にもっと知る必要があります。私が必要とするリソースタイプに関する提案があれば、それは高く評価されます。 –

+0

PythonとSimPyに慣れ親しんでいると感じるまで、これを使い続けます。次に、あなたが望むことをするStoreのサブクラスを作成します。また、すべてのSimPyドキュメントを読んでください。 ;-) –

関連する問題