按书里的样例抄的。

可以看到,将打印速度由第分钟5页提高到10页之后,

每个学生提交打印任务到打印完成的时间明显缩短。

===========================

在计算机科学实验室里考虑下面的情况。

平均每天大约10名学生在实验室工作,每人每小时打印2次。

这些打印任务的长度范围从1到20页。

实验室中的打印机较旧,每分钟以草稿质量可以处理10页。

打印机可以切换以提供更好的质量,但是它将每分钟只能处理5页。

较慢的打印速度可能会使学生等待太久。应使用什么页面速率?

===========================

  1. # coding = utf-8
  2. import random
  3.  
  4. class Printer:
  5. def __init__(self, ppm):
  6. self.page_rate = ppm
  7. self.current_task = None
  8. self.time_remaining = 0
  9.  
  10. def tick(self):
  11. if self.current_task is not None:
  12. self.time_remaining = self.time_remaining - 1
  13. if self.time_remaining <= 0:
  14. self.current_task = None
  15.  
  16. def busy(self):
  17. if self.current_task is not None:
  18. return True
  19. else:
  20. return False
  21.  
  22. def start_next(self, new_task):
  23. self.current_task = new_task
  24. self.time_remaining = new_task.get_pages() * 60/self.page_rate
  25.  
  26. class Task:
  27. def __init__(self, time):
  28. self.time_stamp = time
  29. self.pages = random.randrange(1, 21)
  30.  
  31. def get_stamp(self):
  32. return self.time_stamp
  33.  
  34. def get_pages(self):
  35. return self.pages
  36.  
  37. def wait_time(self, current_time):
  38. return current_time - self.time_stamp
  39.  
  40. class Queue:
  41. def __init__(self):
  42. self.items = []
  43.  
  44. def is_empty(self):
  45. return self.items == []
  46.  
  47. # 入队列,加在首部
  48. def enqueue(self, item):
  49. self.items.insert(0, item)
  50.  
  51. # 出队列,最后一个
  52. def dequeue(self):
  53. return self.items.pop()
  54.  
  55. def size(self):
  56. return len(self.items)
  57.  
  58. def simulation(num_seconds, pages_per_minutes):
  59. lab_printer = Printer(pages_per_minutes)
  60. print_queue = Queue()
  61. waiting_times = []
  62.  
  63. for current_second in range(num_seconds):
  64. if new_print_task():
  65. task = Task(current_second)
  66. print_queue.enqueue(task)
  67. if (not lab_printer.busy()) and (not print_queue.is_empty()):
  68. next_task = print_queue.dequeue()
  69. waiting_times.append(next_task.wait_time(current_second))
  70. lab_printer.start_next(next_task)
  71. lab_printer.tick()
  72. average_wait = sum(waiting_times)/len(waiting_times)
  73. print('Average Wait %6.2f seconds %3d tasks remaining.'% (average_wait, print_queue.size()))
  74.  
  75. def new_print_task():
  76. num = random.randrange(1, 181)
  77. if num == 180:
  78. return True
  79. else:
  80. return False
  81.  
  82. print('=============printer 5ppm===============')
  83. for i in range(10):
  84. simulation(3600, 5)
  85. print('=============printer 10ppm===============')
  86. for i in range(10):
  87. simulation(3600, 10)

  

  1. C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_queue.py
  2. =============printer 5ppm===============
  3. Average Wait 299.63 seconds 3 tasks remaining.
  4. Average Wait 219.16 seconds 1 tasks remaining.
  5. Average Wait 67.89 seconds 0 tasks remaining.
  6. Average Wait 28.47 seconds 0 tasks remaining.
  7. Average Wait 88.47 seconds 0 tasks remaining.
  8. Average Wait 274.36 seconds 1 tasks remaining.
  9. Average Wait 71.88 seconds 0 tasks remaining.
  10. Average Wait 58.25 seconds 0 tasks remaining.
  11. Average Wait 92.94 seconds 0 tasks remaining.
  12. Average Wait 78.45 seconds 0 tasks remaining.
  13. =============printer 10ppm===============
  14. Average Wait 12.36 seconds 0 tasks remaining.
  15. Average Wait 5.55 seconds 0 tasks remaining.
  16. Average Wait 10.00 seconds 0 tasks remaining.
  17. Average Wait 16.12 seconds 0 tasks remaining.
  18. Average Wait 49.08 seconds 0 tasks remaining.
  19. Average Wait 15.68 seconds 0 tasks remaining.
  20. Average Wait 12.71 seconds 0 tasks remaining.
  21. Average Wait 34.44 seconds 0 tasks remaining.
  22. Average Wait 10.07 seconds 0 tasks remaining.
  23. Average Wait 21.60 seconds 0 tasks remaining.

  

python--使用队列结构来模拟共享打印机等候时间的更多相关文章

  1. python--使用队列结构来模拟烫手山芋的游戏

    基本功,磨起来. # coding = utf-8 class Queue: def __init__(self): self.items = [] def is_empty(self): retur ...

  2. python实现队列结构

    # -*- coding:utf-8 -*- # __author__ :kusy # __content__:文件说明 # __date__:2018/10/8 13:49 class MyQueu ...

  3. 刚开始学python——数据结构——“自定义队列结构“

    自定义队列结构  (学习队列后,自己的码) 主要功能:用列表模拟队列结构,考虑了入队,出队,判断队列是否为空,是否已满以及改变队列大小等基本操作. 下面是封装的一个类,把代码保存在myQueue.py ...

  4. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

  5. Python 实现队列

    操作 Queue() 创建一个空的队列 enqueue(item) 往队列中添加一个item元素 dequeue() 从队列头部删除一个元素 is_empty() 判断一个队列是否为空 size() ...

  6. python 操作mysql数据库之模拟购物系统登录及购物

    python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...

  7. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  8. Linux 进程间通信(一)(经典IPC:消息队列、信号量、共享存储)

    有3种称作XSI IPC的IPC:消息队列.信号量.共享存储.这种类型的IPC有如下共同的特性. 每个内核中的IPC都用一个非负整数标志.标识符是IPC对象的内部名称,为了使多个合作进程能够在同一IP ...

  9. Python之目录结构

    Python之目录结构 项目名project_name project_name -|--bin (可执行文件) --|--start.py import os,sys #设置环境变量 BASE_DI ...

随机推荐

  1. leetcode327 Count of Range Sum

    问题描述: 给定一个整数数组nums,返回其所有落在[low, upper]范围内(包含边界)的区间和的数目. 区间和sums(i, j)的定义为所有下标为i到j之间(i ≤ j)的元素的和,包含边界 ...

  2. php-GatewayWorker搭建实时聊天室

    ├── Applications // 这里是所有开发者应用项目 │ └── YourApp // 其中一个项目目录,目录名可以自定义 │ ├── Events.php // 开发者只需要关注这个文件 ...

  3. K-query SPOJ - KQUERY 离线 线段树/树状数组 区间大于K的个数

    题意: 给一个数列,一些询问,问你区间$[l.r]$大于$K$的个数 题解: 又一个"人尽皆知傻逼题"? 我们用一个01序列表示当前询问时,该位置的数字是否对答案有贡献, 显然,对 ...

  4. HTML中添加音乐video embed audio

    做H5页面时需要添加背景音乐,方法如下 方式一:<video controls="" autoplay="" name="media" ...

  5. 029_mount bind挂载

    一. 由于公司的配置标准并不统一,交付的磁盘挂载的路径不是想要的路径,但是 1./home目录下有很重要的堡垒机登录的相关文件,还不能卸载 2.我通过pts/0登录的,这个文件描述符也是在/home目 ...

  6. Centos7.3_x86_64通过systemctl控制tomcat8.0.46启动和停止

    Centos7.3_x86_64通过systemctl控制tomcat8..46启动和停止 之前在centos 6上通过脚本控制tomcat 启动和停止的脚本,虽然在centos 7也可以使用,但ce ...

  7. Python2018-列表的相关操作

    列表中存放的数据是可以进行修改的,比如"增"."删"."改" .“查” "增"-----append, extend, ...

  8. PHP程序守护进程化

    一般Server程序都是运行在系统后台,这与普通的交互式命令行程序有很大的区别.glibc里有一个函数daemon.调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon ...

  9. 查看ubuntu版本信息

    参考文章:https://blog.csdn.net/qq_27818541/article/details/75207986 版本信息lsb_release -a No LSB modules ar ...

  10. 一篇文章教你读懂UI绘制流程

    最近有好多人问我Android没信心去深造了,找不到好的工作,其实我以一个他们进行回复,发现他们主要是内心比较浮躁,要知道技术行业永远缺少的是高手.建议先阅读浅谈Android发展趋势分析,在工作中, ...