首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Simpy队列模拟

Simpy队列模拟
EN

Stack Overflow用户
提问于 2018-04-09 20:13:20
回答 3查看 1.9K关注 0票数 0

我正在尝试模拟一个缓冲区有限的队列,其中没有数据包被丢弃,而是一直处于等待状态。请容忍我,因为我只是一个有基本编程技能的学生。

分组以指数分布到达,并且每个分组保持具有平均1250字节的分组大小。我设法让代码在包到达+处理时间的情况下工作,但是我不能让包‘离开’,也不能模拟队列(到目前为止,它有无限的缓冲区),有什么我可以做的来模拟包离开和队列限制吗?

代码:

代码语言:javascript
复制
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类并模拟数据包到达和处理时间,它就会运行。如果能帮助我模拟数据包离开(使用接收器)和队列限制,我将非常感激。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-04-10 23:37:13

不熟悉细节,但是您在queue构造函数中对python的调用将进入一个紧凑的无限循环-它不是一个生成器,而是一个无休止的循环,所以python将在执行过程中被卡住。

票数 1
EN

Stack Overflow用户

发布于 2021-05-20 04:00:07

你好,我想代码会解决你的问题,或者至少给你一个方向。因为在你的原始代码中,所有的包都有相同的大小,我在这个包中建模,但是更改为字节是很简单的。

我使用了一个缓冲区(容器)和一个服务器(资源)。

;)

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-05-20 06:14:11

我认为您的代码中的代码是一个无限循环,并且阻塞了您的代码的运行

代码语言:javascript
复制
def monitor_tank(self, env):
        while True:
           if self.buffer.level > 12500:
             print('Full at %d' % env.now)

尝试注释掉这段代码,或者添加一个env.timeout,这样它在每次循环时都会“休眠”一段时间

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49732721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档