我正在尝试模拟一个缓冲区有限的队列,其中没有数据包被丢弃,而是一直处于等待状态。请容忍我,因为我只是一个有基本编程技能的学生。
分组以指数分布到达,并且每个分组保持具有平均1250字节的分组大小。我设法让代码在包到达+处理时间的情况下工作,但是我不能让包‘离开’,也不能模拟队列(到目前为止,它有无限的缓冲区),有什么我可以做的来模拟包离开和队列限制吗?
代码:
import random
import simpy
RANDOM_SEED = 42
NEW_CUSTOMERS = 100 # Total number of customers
INTERVAL_CUSTOMERS = 1 # Generate new customers roughly every x seconds
SIZE = 1250
def source(env, number, interval, port):
"""Source generates packet randomly"""
for i in range(number):
size = int(random.expovariate(0.0008))
packet = Packet(env, '%d' % i, size, port, time_in_port=1)
env.process(packet)
t = random.expovariate(1 / interval)
yield env.timeout(t)
def Packet(env, id, size, port, time_in_port):
arrive = env.now
yield Queue.buffer.put(size)
print('packet%s %s arriving at %lf' % (id, size, arrive))
with port.request() as req:
yield req
tip = random.expovariate(1/time_in_port)
yield env.timeout(tip)
amount = size
yield Queue.buffer.get(amount)
print('packet%s %s finished processing at %lf' % (id, size, env.now))
class queue: #THIS PART WON'T WORK
def __init__(self, env):
self.port = simpy.Resource(env, capacity=1)
self.buffer = simpy.Container(env, init = 0, capacity=12500)
self.mon_proc = env.process(self.monitor_tank(env))
def monitor_tank(self, env):
while True:
if self.buffer.level > 12500:
print('Full at %d' % env.now)
random.seed(RANDOM_SEED)
env = simpy.Environment()
Queue = queue(env)
port = simpy.Resource(env, capacity=1)
env.process(source(env, NEW_CUSTOMERS, INTERVAL_CUSTOMERS, port))
env.run()queue类不工作(程序根本不会运行)。只要我删除queue类并模拟数据包到达和处理时间,它就会运行。如果能帮助我模拟数据包离开(使用接收器)和队列限制,我将非常感激。谢谢。
发布于 2018-04-10 23:37:13
不熟悉细节,但是您在queue构造函数中对python的调用将进入一个紧凑的无限循环-它不是一个生成器,而是一个无休止的循环,所以python将在执行过程中被卡住。
发布于 2021-05-20 04:00:07
你好,我想代码会解决你的问题,或者至少给你一个方向。因为在你的原始代码中,所有的包都有相同的大小,我在这个包中建模,但是更改为字节是很简单的。
我使用了一个缓冲区(容器)和一个服务器(资源)。
;)
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发布于 2021-05-20 06:14:11
我认为您的代码中的代码是一个无限循环,并且阻塞了您的代码的运行
def monitor_tank(self, env):
while True:
if self.buffer.level > 12500:
print('Full at %d' % env.now)尝试注释掉这段代码,或者添加一个env.timeout,这样它在每次循环时都会“休眠”一段时间
https://stackoverflow.com/questions/49732721
复制相似问题