2016-03-24 12 views
0

Ich bin ein Anfänger, der beginnt, Python und Simpy zu verwenden. Ich möchte einen synchronen Kommunikationskanal zwischen 2 Prozessen haben. Zum Beispiel würde Ich mag haben:Simpy synchroner Kommunikationskanal

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

Es sollte als Ergebnis geben:

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

Was soll ich machen/Einsatz für die Definition des Kanals?

Wenn ich ein Store als I (leicht von oben) bekommen würde:

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

und der Ausgang wäre:

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

Aber ich soll wie oben erwähnt, erhalten. Der Schreiber sollte warten, bis der Leser bereit ist zu lesen.

Antwort

0

Was Sie wollen, ist nicht direkt mit den eingebauten Ressourcen möglich. Eine Abhilfe könnte die folgende sein:

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

Ausgang:

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

Wenn Sie das tun die print() vor yield msg.received, erhalten Sie:

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

Die Alternative wäre, schreiben Sie Ihre eigener Ressourcentyp.

+0

Vielen Dank für Ihre Antwort. Aber sowohl der Lese- als auch der Schreibprozess sollten aufeinander warten. Das wird nicht passieren, oder? Ich schätze, der Autor wird fortfahren, obwohl es warten sollte, bis der Leser bereit ist zu lesen. –

+0

Vielen Dank. Im Grunde ist das was ich brauche. Ich werde jetzt darüber nachdenken, meinen eigenen Ressourcentyp zu schreiben. Aber zuerst muss ich mehr über Simpy und über Python im Allgemeinen erfahren. Wenn Sie Vorschläge für den Ressourcentyp haben, den ich brauche, wird das sehr geschätzt. –

+0

Ich würde dies weiter verwenden, bis Sie sich mit Python und SimPy wohler fühlen und vertraut sind. Dann würde ich eine Unterklasse von Store schreiben, die das macht, was Sie wollen. Lesen Sie auch alle SimPy-Dokumente. ;-) –

Verwandte Themen