我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python的队列实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python的队列实例分析

这篇“Python的队列实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python的队列实例分析”文章吧。

    模拟打印机任务队列过程

    计算机科学中也有众多的队列例子。比如计算机实验室有10台计算机,它们都与同一台打印机相连。当学生需要打印的时候,他们的打印任务会进入一个队列。该队列中的第一个任务就是即将执行的打印任务。如果一个任务排在队列的最后面,那么它必须等到所有前面的任务都执行完毕后才能执行。

    学生向共享打印机发送打印请求,这些打印任务被存在一个队列中,并且按照先到先得的顺序执行。这样的设定可能导致很多问题。其中最重要的是,打印机能否处理一定量的工作。如果不能,学生可能会由于等待过长时间而错过要上的课。

    考虑计算机实验室里的这样一个场景:在任何给定的一小时内,实验室里都有10个学生。他们在这 一小时内最多打印2次,并且打印的页数从1到20页不等。实验室的打印机比较老旧,每分钟只能以低质量打印10页。也可以将打印质量调高,但是这样做会导致打印机每分钟只能打印5页。降低打印速度可能导致学生等待过长时间。那么,应该如何设置打印速度呢?

    可以通过构建一个模型来解决该问题。我们需要为学生打印任务打印机构建对象。当学生提交打印任务时,我们需要将它们加入打印机的任务队列中。当打印机执行完一个任务后,它会检查该队列,看看其中是否还有需要处理的任务。我们感兴趣的是学生平均需要等待多久才能拿到打印好的文章。这个时间等于打印任务在队列中的平均等待时间。

    在模拟时,需要应用一些概率学知识。举例来说,学生打印的文章可能有1~20页。如果各页数出现的概率相等,那么打印任务的实际时长可以通过模拟1~20的一个文章页数随机数来计算得出。

    如果实验室里有10个学生,并且在一小时内每个人都打印次,那么每小时平均就有20个打印任务。 在任意一秒,创建一个打印请求的概率是多少? 回答这个问题需要考虑任务与时间的比值。每小时20个任务相当于每180秒1个任务。

    Python的队列实例分析

    可以通过1~180的一个随机数来模拟每秒内产生打印请求的概率(1/180的概率)。如果随机数正好是180,那么就认为有 一个打印请求被创建。注意,可能会出现多个请求接连被创建的情况,也可能很长一段时间内都没有请求。这就是模拟的本质。我们希望在常用参数已知的情况下尽可能准确地模拟。

    主要模拟步骤:

    创建一个打印任务队列。每一个任务到来时都会有一个时间戳。一开始,队列是空的。

    针对每一秒(currentSecond),执行以下操作。

    • 是否有新创建的打印任务?如果是,以 currentSecond 作为其时间戳并将该任务加入到队列中。

    • 如果打印机空闲,并且有正在等待执行的任务,执行以下操作:

      • 队列中取出第一个任务并提交给打印机;

      • 用 currentSecond 减去该任务的时间戳,以此计算其等待时间

      • 将该任务的等待时间存入一个列表,用来作为计算平均等待时间的数据;

      • 根据该任务的页数,计算执行时间。

    • 打印机进行一秒的打印,同时从该任务的执行时间中减去一秒。

    • 如果打印任务执行完毕,即任务的执行时间减为0,则说明打印机回到空闲状态。

    当模拟完成之后,根据等待时间列表中的值计算平均等待时间。

    构建队列程序

    class Queue:    def __init__(self):        self.items = []            # 构建空队列    def isEmpty(self):        return self.items ==[]     # 判断是否为空    def enqueue(self,item):        self.items.insert(0, item) # 在队列尾部(列表左端)插入元素    def dequeue(self):        return self.items.pop()    # 在队列头部(列表右端)移出元素    def size(self):        return len(self.items)     # 队列(列表)长度

    模拟打印程序

    import random# 模拟打印机class Printer:    # 打印机初始化    def __init__(self, ppm):        self.pagerate = ppm      # 打印速度 页/分钟        self.currentTask = None  # 现有任务        self.timeRemain = 0      # 该任务所需时间    # 打印任务倒计时 0代表打印完成    def tick(self):        # 如果打印机正在执行任务        if self.currentTask != None:            # 该任务执行时间 = 执行时间 - 1(执行时间倒计时)            self.timeRemaining = self.timeRemaining - 1               if self.timeRemaining <= 0:     # 该任务执行时间 <= 0                self.currentTask = None     # 该任务执行完毕    # 判断打印机是否空闲    def busy(self):        if self.currentTask != None:            return True        else:            return False    # 打印机接受新任务    def startNext(self, newtask):        self.currentTask = newtask        # 新打印任务需要时间 = 新任务页数 * (60 / 每分钟打印多少页的速度)        # (60 / 每分钟打印多少页的速度) = 每打印一页所需要的秒数        self.timeRemaining = newtask.getPages() * (60 / self.pagerate)# 模拟单个任务的属性class Task:    # 任务初始化    def __init__(self, time):        self.timestamp = time                # 创建任务的时间点        self.pages = random.randrange(1, 21) # 任务页数 在 1~20 间随机生成    def getStamp(self):        return self.timestamp  # 获取任务创建的时间点    def getPages(self):        return self.pages      # 获取任务的页数    def waitTime(self, currenttime):        # 任务的等待时间 = 当前时间 - 任务创建的时间点        return currenttime - self.timestamp   # 模拟学生创建的新打印请求def newPrintTask():    # 打印请求是一个随机事件    # 通过1~180之间的一个随机数来模拟每秒内产生打印请求的概率    # 如果随机数正好是180,那么就认为有一个打印请求被创建。    num = random.randrange(1, 181)    if num == 180:        return True    else:        return False# 模拟打印过程def simulation(numSeconds, pagesPerMinute):    labprinter = Printer(pagesPerMinute)    printQueue = Queue()    waitingtimes = []    for currentSecond in range(numSeconds):        if newPrintTask():            task = Task(currentSecond)            printQueue.enqueue(task)        if(not labprinter.busy())and(not printQueue.isEmpty()):            nexttask = printQueue.dequeue()            waitingtimes.append(nexttask.waitTime(currentSecond))            labprinter.startNext(nexttask)        labprinter.tick()    averageWait = sum(waitingtimes)/len(waitingtimes)    print("平均等待 %6.2f 秒,还有 %3d 个任务等待处理"          % (averageWait, printQueue.size()))

    模拟打印过程(有注释)

    def simulation(numSeconds, pagesPerMinute):    # numSeconds-时间段    # pagesPerMinute-打印速度,页/分钟    labprinter = Printer(pagesPerMinute)  # 创建打印机    printQueue = Queue()                  # 创建打印机任务队列    waitingtimes = []                     # 创建等待时间数据样本列表    for currentSecond in range(numSeconds):  # 一次循环代表一秒        if newPrintTask():                   # 如果 有打印请求创建            task = Task(currentSecond)       # 创建打印任务并记录当前时间点            printQueue.enqueue(task)         # 打印任务进入打印机任务队列        # 如果 打印机空闲 并且 打印机任务队列有任务        if(not labprinter.busy())and(not printQueue.isEmpty()):            nexttask = printQueue.dequeue()  # 从队列取出新任务            # 根据当前时间点计算新任务在任务队列里的等待时间 并将等待时间记录进样本列表            waitingtimes.append(nexttask.waitTime(currentSecond))            labprinter.startNext(nexttask)   # 开始执行新任务 打印机进入忙碌状态        labprinter.tick()  # 每循环一次 当前打印任务执行倒计时减少一秒    averageWait = sum(waitingtimes)/len(waitingtimes)    print("平均等待 %6.2f 秒,还有 %3d 个任务等待处理" % (averageWait, printQueue.size()))

    需要注意的是,时间戳是我们根据循环模拟出来的,我们给定了 numSeconds 时间段后,每循环一次相当于时间过了一秒。

    虽然每次模拟的结果不一定相同。但对此我们不需要在意。这是由于随机数的本质导致的。我们感兴趣的是当参数改变时结果出现的趋势

    下面是一些结果:

    Python的队列实例分析
    Python的队列实例分析

    我们根据模拟得到了打印机在两种速度下,一小时内的任务执行情况的参考数据。可以很明显的看到,当打印质量提升后,学生平均等待时间相比低质量情况下显著增加,并且任务处理未完成的次数也出现了增加,所以设置打印机为低质量模式是最合适的。

    以上就是关于“Python的队列实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Python的队列实例分析

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Python的队列实例分析

    这篇“Python的队列实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python的队列实例分析”文章吧。模拟打印机
    2023-06-29

    php双向队列的实例分析

    php双向队列的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、双向队列是指一种具有队列和栈的性质的数据结构。2、双向队列中的元素可以从两端弹出,其限
    2023-06-25

    Java的栈和队列实例分析

    这篇文章主要讲解了“Java的栈和队列实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的栈和队列实例分析”吧!栈package com.yuzhenc.collection;i
    2023-06-29

    php中队列的示例分析

    小编给大家分享一下php中队列的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是队列?相对于栈来说,队列是一种先进先出(FIFO)的顺序逻辑结构。什么
    2023-06-20

    python中队列基本操作和多线程队列的示例分析

    这篇文章给大家分享的是有关python中队列基本操作和多线程队列的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、队列基本操作from queue import Queueq = Queue(5) #
    2023-06-29

    python实现出队的示例分析

    这篇文章主要介绍python实现出队的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!出队如下所示,出队能让代码非常整洁:import collections Q = collections.deque() Q
    2023-06-27

    Python中线程安全队列Queue的示例分析

    小编给大家分享一下Python中线程安全队列Queue的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是队列?像排队一样,从头到尾排成一排,还可以有人继续往后排队,这就是队列。这里学委想说的是Queue这个
    2023-06-29

    goFrame的队列gqueue对比channel使用实例分析

    本篇内容介绍了“goFrame的队列gqueue对比channel使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!channel首
    2023-07-02

    C++数据结构的栈与队列实例分析

    今天小编给大家分享一下C++数据结构的栈与队列实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 栈1.1 栈的概念
    2023-06-30

    C语言中队列的示例分析

    这篇文章将为大家详细讲解有关C语言中队列的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列(Queue)0x00 队列的概念???? 概念:① 队列只允许在一端进行插入数据操作,在另一端进行
    2023-06-29

    消息队列RabbitMQ入门与PHP实例分析

    本篇内容主要讲解“消息队列RabbitMQ入门与PHP实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“消息队列RabbitMQ入门与PHP实例分析”吧!消息队列介绍以及消息队列应用场景Ra
    2023-06-30

    如何分析Python全栈中的队列

    如何分析Python全栈中的队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. lock互斥锁知识点:lock.acquire()# 上锁lock.release()# 解
    2023-06-22

    C语言栈与队列面试题实例分析

    本文小编为大家详细介绍“C语言栈与队列面试题实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言栈与队列面试题实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、括号匹配问题链接直达:有效的括号题
    2023-06-29

    C++中Queue队列类模版的示例分析

    这篇文章主要介绍C++中Queue队列类模版的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.队列的介绍队列的定义队列(Queue)是一种线性存储结构。它有以下几个特点:按照"先进先出(FIFO, Firs
    2023-06-29

    JavaScript单线程和任务队列使用实例分析

    这篇文章主要介绍“JavaScript单线程和任务队列使用实例分析”,在日常操作中,相信很多人在JavaScript单线程和任务队列使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScrip
    2023-06-20

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录