Python Simpy队列模拟

Python Simpy队列模拟,python,networking,network-programming,simulation,simpy,Python,Networking,Network Programming,Simulation,Simpy,我试图模拟一个缓冲区有限的队列,其中没有数据包被丢弃,而是保持等待。请容忍我,因为我只是一个有基本编码技能的学生 数据包以指数分布到达,每个数据包的平均大小为1250字节。我设法让代码为数据包到达+处理时间工作,但我无法使数据包“离开”,也无法模拟队列。到目前为止,它具有无限缓冲区。我能做些什么来模拟数据包离开和队列限制吗 代码: 队列类不起作用,程序根本无法运行。只要我删除队列类并模拟数据包到达和处理时间,它就会运行。如果您能帮助我使用接收器和队列限制模拟数据包离开,我将不胜感激。谢谢。不熟悉

我试图模拟一个缓冲区有限的队列,其中没有数据包被丢弃,而是保持等待。请容忍我,因为我只是一个有基本编码技能的学生

数据包以指数分布到达,每个数据包的平均大小为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)