2016-03-24 17 views
0

Python ve Simpy'i kullanmaya başlayan bir yeni kullanıcıyım. 2 işlem arasında bir senkron iletişim kanalına sahip olmak istiyorum. Mesela ben istiyorum:Simpy eşzamanlı iletişim kanalı

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

Ben kanalın tanımı için/kullanımını Ne yapmalısınız:

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

O sonucunda vermelidir?

I (yukarıda biraz farklı) alacağı daha ben Store kullanıyorsanız:

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

ve çıkış olacaktır:

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

Fakat yukarıda da belirtildiği gibi ben almalısınız. Yazar, okuyucu okunmaya hazır olana kadar beklemelidir.

cevap

0

Ne istediğinizi, yerleşik kaynaklarla doğrudan mümkün değildir. Bir geçici çözüm şu olabilir:

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

Çıktı:

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

Bunu yaparsanız print()yield msg.received önce elde edersiniz:

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

alternatif yazmak olacaktır senin kendi kaynak türü.

+0

Cevabınız için çok teşekkürler. Ancak hem okuyucu hem yazar süreci birbirini beklemeli. Bu gerçekleşmeyecek, değil mi? Okuyucu okunmaya hazır olana kadar beklemesine rağmen yazar devam edecek sanırım. –

+0

Çok teşekkür ederim. Temel olarak ihtiyacım olan şey bu. Şimdi kendi kaynak türümü yazmayı düşünüyorum. Ama önce Simpy ve genel olarak Python hakkında daha fazla şey öğrenmeliyim. İhtiyacım olan kaynak türü için herhangi bir öneriniz varsa, bu çok takdir edilecektir. –

+0

Python ve SimPy ile daha rahat ve aşina olana kadar bunu kullanmaya devam ediyorum. Sonra, istediğini yapan bir Mağaza alt sınıfı yazarım. Ayrıca, tüm SimPy belgelerini okuyun. ;-) –