Python Simpy队列模拟
我试图模拟一个缓冲区有限的队列,其中没有数据包被丢弃,而是保持等待。请容忍我,因为我只是一个有基本编码技能的学生 数据包以指数分布到达,每个数据包的平均大小为1250字节。我设法让代码为数据包到达+处理时间工作,但我无法使数据包“离开”,也无法模拟队列。到目前为止,它具有无限缓冲区。我能做些什么来模拟数据包离开和队列限制吗 代码:Python Simpy队列模拟,python,networking,network-programming,simulation,simpy,Python,Networking,Network Programming,Simulation,Simpy,我试图模拟一个缓冲区有限的队列,其中没有数据包被丢弃,而是保持等待。请容忍我,因为我只是一个有基本编码技能的学生 数据包以指数分布到达,每个数据包的平均大小为1250字节。我设法让代码为数据包到达+处理时间工作,但我无法使数据包“离开”,也无法模拟队列。到目前为止,它具有无限缓冲区。我能做些什么来模拟数据包离开和队列限制吗 代码: 队列类不起作用,程序根本无法运行。只要我删除队列类并模拟数据包到达和处理时间,它就会运行。如果您能帮助我使用接收器和队列限制模拟数据包离开,我将不胜感激。谢谢。不熟悉
队列类不起作用,程序根本无法运行。只要我删除队列类并模拟数据包到达和处理时间,它就会运行。如果您能帮助我使用接收器和队列限制模拟数据包离开,我将不胜感激。谢谢。不熟悉细节,但是您在队列构造函数中对self.monitor\u tankenv的调用将进入一个紧密的无限循环-它不是一个生成器,只是一个无休止的循环,因此python将在执行过程中被卡住。您好,我认为代码将解决您的问题,或者至少为您提供一个方向。正如在您的原始代码中一样,所有包都具有相同的大小,我在这个包中建模,但是更改为字节是很简单的 我使用了一个缓冲容器和一个服务器资源 )
我认为您的代码中的这段代码是一个无限循环,会阻止您的代码运行
def monitor_tank(self, env):
while True:
if self.buffer.level > 12500:
print('Full at %d' % env.now)
尝试注释这篇文章,或者添加一个env.timeout,这样它在每次循环过程中都会休眠一段时间
import simpy
import random
def arrival(env, buffer):
#Arrival of the Package
while True:
print('Package ARRIVED at %.1f \n\t Buffer: %i'
% (env.now, buffer.level))
yield buffer.put(1) # Put the package in the buffer
yield env.timeout(random.expovariate(1.0)) # time between arrivals
env.process(processDeparture(env, buffer, server))
def processDeparture(env, buffer, server):
#Processing and Departure of the Package
while True:
# request a Server to process thge package
request = server.request()
yield request
yield buffer.get(1) # GET a package from the buffer
# Processing time of the package
processingTime = 2
print('Package begin processing at %.1f'
% (env.now))
yield env.timeout(processingTime)
print('Package end processing at %.1f'
% (env.now))
# release the server
yield server.release(request)
random.seed(150)
env = simpy.Environment()
buffer = simpy.Container(env, capacity=3, init=0) # Create the Buffer
server = simpy.Resource(env, capacity=1) # Create the servers (resources)
env.process(arrival(env, buffer))
env.run(until=30) # Execute the Model
def monitor_tank(self, env):
while True:
if self.buffer.level > 12500:
print('Full at %d' % env.now)