我想模拟一种通信过程,其中源不断生成消息并将其发送到接收器,而消息在到达目的地之前必须覆盖一定距离。但是,距离可能会随着时间的推移而改变,因此每条消息在电缆中的持续时间并不相同。我的第一种方法是使用env.timeout(t_i)
,其中t_i
是电缆中第条消息的时间。我的代码是这样的
import simpy
import random
class network:
def __init__(self) -> None:
self.env = simpy.Environment()
self.cable = simpy.Store(self.env)
def generateMessage(self):
i = 0
while True:
message = (f'message: {i}', f'travel time {0.1 + round(random.random(), 3)}', (round(random.random(), 3)))
i += 1
print(f'gen at: {self.env.now} {message}')
yield self.env.timeout(0.1)
self.cable.put(message)
def receieveMessage(self):
while True:
# wait for message to travel in the cable for 'sometime' before arrive
message = yield self.cable.get()
yield self.env.timeout(message[2]) #<- This is not the right approach
print(f'receieve at {self.env.now}, message: {message[:2]}')
def run(self):
self.env.process(self.generateMessage())
self.env.process(self.receieveMessage())
self.env.run(until=1)
q = network()
q.run()
输出在哪里
gen at: 0 ('message: 0', 'travel time 0.22', 0.22)
gen at: 0.1 ('message: 1', 'travel time 0.71', 0.71)
gen at: 0.2 ('message: 2', 'travel time 0.377', 0.377)
gen at: 0.30000000000000004 ('message: 3', 'travel time 1.056', 1.056)
receieve at 0.32, message: ('message: 0', 'travel time 0.22')
gen at: 0.4 ('message: 4', 'travel time 0.138', 0.138)
gen at: 0.5 ('message: 5', 'travel time 0.45299999999999996', 0.45299999999999996)
gen at: 0.6 ('message: 6', 'travel time 1.024', 1.024)
gen at: 0.7 ('message: 7', 'travel time 0.695', 0.695)
gen at: 0.7999999999999999 ('message: 8', 'travel time 0.503', 0.503)
gen at: 0.8999999999999999 ('message: 9', 'travel time 0.702', 0.702)
gen at: 0.9999999999999999 ('message: 10', 'travel time 0.75', 0.75)
这不是我想要的,因为在这种方法中,receieveMessage
方法的每个循环在下一次迭代之前等待travel_time
,而不是在通过receieveMessage
方法之前等待travel_time
的消息延迟
期望的输出应该是这样的
gen at: 0 ('message: 0', 'travel time 0.207')
gen at: 0.1 ('message: 1', 'travel time 0.735')
receieve at 0.207, message: ('message: 0', 'travel time 0.207')
gen at: 0.2 ('message: 2', 'travel time 0.498')
gen at: 0.3 ('message: 3', 'travel time 0.492')
gen at: 0.4 ('message: 4', 'travel time 0.864')
gen at: 0.5 ('message: 5', 'travel time 0.241')
gen at: 0.6 ('message: 6', 'travel time 0.505')
receieve at 0.698, message: ('message: 2', 'travel time 0.498')
gen at: 0.7 ('message: 7', 'travel time 0.76')
receieve at 0.741, message: ('message: 5', 'travel time 0.241')
receieve at 0.792, message: ('message: 3', 'travel time 0.492')
gen at: 0.8 ('message: 8', 'travel time 0.815')
receieve at 0.835, message: ('message: 1', 'travel time 0.735')
gen at: 0.9 ('message: 9', 'travel time 0.104')
gen at: 1 ('message: 10', 'travel time 0.524')
# Message of generated message which should not print out be cause the util arg.
receieve at 1.004, message: ('message: 9', 'travel time 0.104')
receieve at 1.105, message: ('message: 6', 'travel time 0.505')
receieve at 1.264, message: ('message: 4', 'travel time 0.864')
receieve at 1.46, message: ('message: 7', 'travel time 0.76')
receieve at 1.524, message: ('message: 10', 'travel time 0.524')
receieve at 1.615, message: ('message: 8', 'travel time 0.815')
我应该如何做到这一点?我正在考虑为每条消息引入另一个流程,但这似乎只是一个想法
我认为simpy更有用,如果你可以一次发送多条信息。我还认为,当您建议创建另一个流程时,您的思路是正确的
我将生成器与发送进程分离,以便消息可以作为独立进程竞争公共资源(通道)。打开通道查看消息发送时间戳的重叠情况
好的,这里有一个简单的答案。这里的关键是你的接收者不是一个进程。消息的接收是事件的结果。因此,创建一个超时事件,并让接收方作为该事件的回调
输出:
在考虑了Tim Roberts的答案之后,我提出了适合我的用例的我自己的答案。正如Michael所指出的,为每条消息创建另一个流程也是可行的
对于输出:
相关问题 更多 >
编程相关推荐