<p>我认为simpy更有用,如果你可以一次发送多条信息。我还认为,当您建议创建另一个流程时,您的思路是正确的</p>
<p>我将生成器与发送进程分离,以便消息可以作为独立进程竞争公共资源(通道)。打开通道查看消息发送时间戳的重叠情况</p>
<pre><code>"""
quick sim to send messages over a network chanel
programmer: Michael R. Gibbs
"""
import simpy
import random
class Network():
def __init__(self, env, num_of_chanels):
"""
The num_of_chanels limits how many messages
can be "sending" at one time.
If all the chanels are busy, then new messages queue up
for next available chanel
"""
self.env = env
self.num_of_chanels = num_of_chanels
self.chanels = simpy.Resource(env, num_of_chanels)
def send_mess(self, mess):
"""
sim process for sending a message
All the send mess process queue up for a channel resource
Then with the channel 'sends' the messaage
The release the channel for the next senm mess process in the queue
mess is a tuple of (id, message text, send time)
"""
print(f'{self.env.now}: - message: {mess[0]} being queued')
with self.chanels.request() as req:
yield req
print(f'{self.env.now}: - message: {mess[0]} being sent')
yield self.env.timeout(mess[2])
print(f'{self.env.now}: - message: {mess[0]} has been sent {mess[1]}')
def gen_messages(env, network):
"""
Generates a series of messages with a random send time
"""
id = 1
while True:
# change the randint params to stress the queue more
yield env.timeout(random.randint(1,3))
# (id, mess text, send time)
mess = (id, 'mess ' + str(id), random.randint(1,4))
id += 1
# no yield here, just drop and go
env.process(network.send_mess(mess))
# create and start sim
env = simpy.Environment()
network = Network(env,1) # start with just one chanel
env.process(gen_messages(env, network))
env.run(50)
</code></pre>