<p>在考虑了Tim Roberts的答案之后,我提出了适合我的用例的我自己的答案。正如Michael所指出的,为每条消息创建另一个流程也是可行的</p>
<pre><code>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:
travel_time = round(random.random(), 3) + 0.1
message = (f'message: {i}', f'travel time {travel_time:.3f}', travel_time)
i += 1
print(f'gen at: {self.env.now:.3f} {message}')
self.env.process(self.travel(message))
yield self.env.timeout(0.1)
def receieveMessage(self):
while True:
message = yield self.cable.get()
print(f'receieve at {self.env.now:.3f}, message: {message[:2]}')
def travel(self, message):
yield self.env.timeout(message[2])
self.cable.put(message)
def run(self):
self.env.process(self.generateMessage())
self.env.process(self.receieveMessage())
self.env.run(until=1)
q = network()
q.run()
</code></pre>
<p>对于输出:</p>
<pre><code>gen at: 0.000 ('message: 0', 'travel time 1.068', 1.068)
gen at: 0.100 ('message: 1', 'travel time 0.299', 0.29900000000000004)
gen at: 0.200 ('message: 2', 'travel time 0.228', 0.228)
gen at: 0.300 ('message: 3', 'travel time 0.535', 0.535)
receieve at 0.399, message: ('message: 1', 'travel time 0.299')
gen at: 0.400 ('message: 4', 'travel time 0.778', 0.778)
receieve at 0.428, message: ('message: 2', 'travel time 0.228')
gen at: 0.500 ('message: 5', 'travel time 0.953', 0.953)
gen at: 0.600 ('message: 6', 'travel time 0.344', 0.344)
gen at: 0.700 ('message: 7', 'travel time 0.686', 0.6859999999999999)
gen at: 0.800 ('message: 8', 'travel time 0.476', 0.476)
receieve at 0.835, message: ('message: 3', 'travel time 0.535')
gen at: 0.900 ('message: 9', 'travel time 1.053', 1.053)
receieve at 0.944, message: ('message: 6', 'travel time 0.344')
gen at: 1.000 ('message: 10', 'travel time 0.866', 0.866)
</code></pre>