python--使用队列结构来模拟共享打印机等候时间
按书里的样例抄的。
可以看到,将打印速度由第分钟5页提高到10页之后,
每个学生提交打印任务到打印完成的时间明显缩短。
===========================
在计算机科学实验室里考虑下面的情况。
平均每天大约10名学生在实验室工作,每人每小时打印2次。
这些打印任务的长度范围从1到20页。
实验室中的打印机较旧,每分钟以草稿质量可以处理10页。
打印机可以切换以提供更好的质量,但是它将每分钟只能处理5页。
较慢的打印速度可能会使学生等待太久。应使用什么页面速率?
===========================
- # coding = utf-8
- import random
- class Printer:
- def __init__(self, ppm):
- self.page_rate = ppm
- self.current_task = None
- self.time_remaining = 0
- def tick(self):
- if self.current_task is not None:
- self.time_remaining = self.time_remaining - 1
- if self.time_remaining <= 0:
- self.current_task = None
- def busy(self):
- if self.current_task is not None:
- return True
- else:
- return False
- def start_next(self, new_task):
- self.current_task = new_task
- self.time_remaining = new_task.get_pages() * 60/self.page_rate
- class Task:
- def __init__(self, time):
- self.time_stamp = time
- self.pages = random.randrange(1, 21)
- def get_stamp(self):
- return self.time_stamp
- def get_pages(self):
- return self.pages
- def wait_time(self, current_time):
- return current_time - self.time_stamp
- class Queue:
- def __init__(self):
- self.items = []
- def is_empty(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)
- def simulation(num_seconds, pages_per_minutes):
- lab_printer = Printer(pages_per_minutes)
- print_queue = Queue()
- waiting_times = []
- for current_second in range(num_seconds):
- if new_print_task():
- task = Task(current_second)
- print_queue.enqueue(task)
- if (not lab_printer.busy()) and (not print_queue.is_empty()):
- next_task = print_queue.dequeue()
- waiting_times.append(next_task.wait_time(current_second))
- lab_printer.start_next(next_task)
- lab_printer.tick()
- average_wait = sum(waiting_times)/len(waiting_times)
- print('Average Wait %6.2f seconds %3d tasks remaining.'% (average_wait, print_queue.size()))
- def new_print_task():
- num = random.randrange(1, 181)
- if num == 180:
- return True
- else:
- return False
- print('=============printer 5ppm===============')
- for i in range(10):
- simulation(3600, 5)
- print('=============printer 10ppm===============')
- for i in range(10):
- simulation(3600, 10)
- C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_queue.py
- =============printer 5ppm===============
- Average Wait 299.63 seconds 3 tasks remaining.
- Average Wait 219.16 seconds 1 tasks remaining.
- Average Wait 67.89 seconds 0 tasks remaining.
- Average Wait 28.47 seconds 0 tasks remaining.
- Average Wait 88.47 seconds 0 tasks remaining.
- Average Wait 274.36 seconds 1 tasks remaining.
- Average Wait 71.88 seconds 0 tasks remaining.
- Average Wait 58.25 seconds 0 tasks remaining.
- Average Wait 92.94 seconds 0 tasks remaining.
- Average Wait 78.45 seconds 0 tasks remaining.
- =============printer 10ppm===============
- Average Wait 12.36 seconds 0 tasks remaining.
- Average Wait 5.55 seconds 0 tasks remaining.
- Average Wait 10.00 seconds 0 tasks remaining.
- Average Wait 16.12 seconds 0 tasks remaining.
- Average Wait 49.08 seconds 0 tasks remaining.
- Average Wait 15.68 seconds 0 tasks remaining.
- Average Wait 12.71 seconds 0 tasks remaining.
- Average Wait 34.44 seconds 0 tasks remaining.
- Average Wait 10.07 seconds 0 tasks remaining.
- Average Wait 21.60 seconds 0 tasks remaining.
python--使用队列结构来模拟共享打印机等候时间的更多相关文章
- python--使用队列结构来模拟烫手山芋的游戏
基本功,磨起来. # coding = utf-8 class Queue: def __init__(self): self.items = [] def is_empty(self): retur ...
- python实现队列结构
# -*- coding:utf-8 -*- # __author__ :kusy # __content__:文件说明 # __date__:2018/10/8 13:49 class MyQueu ...
- 刚开始学python——数据结构——“自定义队列结构“
自定义队列结构 (学习队列后,自己的码) 主要功能:用列表模拟队列结构,考虑了入队,出队,判断队列是否为空,是否已满以及改变队列大小等基本操作. 下面是封装的一个类,把代码保存在myQueue.py ...
- 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
- Python 实现队列
操作 Queue() 创建一个空的队列 enqueue(item) 往队列中添加一个item元素 dequeue() 从队列头部删除一个元素 is_empty() 判断一个队列是否为空 size() ...
- python 操作mysql数据库之模拟购物系统登录及购物
python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...
- Python消息队列工具 Python-rq 中文教程
原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...
- Linux 进程间通信(一)(经典IPC:消息队列、信号量、共享存储)
有3种称作XSI IPC的IPC:消息队列.信号量.共享存储.这种类型的IPC有如下共同的特性. 每个内核中的IPC都用一个非负整数标志.标识符是IPC对象的内部名称,为了使多个合作进程能够在同一IP ...
- Python之目录结构
Python之目录结构 项目名project_name project_name -|--bin (可执行文件) --|--start.py import os,sys #设置环境变量 BASE_DI ...
随机推荐
- leetcode327 Count of Range Sum
问题描述: 给定一个整数数组nums,返回其所有落在[low, upper]范围内(包含边界)的区间和的数目. 区间和sums(i, j)的定义为所有下标为i到j之间(i ≤ j)的元素的和,包含边界 ...
- php-GatewayWorker搭建实时聊天室
├── Applications // 这里是所有开发者应用项目 │ └── YourApp // 其中一个项目目录,目录名可以自定义 │ ├── Events.php // 开发者只需要关注这个文件 ...
- K-query SPOJ - KQUERY 离线 线段树/树状数组 区间大于K的个数
题意: 给一个数列,一些询问,问你区间$[l.r]$大于$K$的个数 题解: 又一个"人尽皆知傻逼题"? 我们用一个01序列表示当前询问时,该位置的数字是否对答案有贡献, 显然,对 ...
- HTML中添加音乐video embed audio
做H5页面时需要添加背景音乐,方法如下 方式一:<video controls="" autoplay="" name="media" ...
- 029_mount bind挂载
一. 由于公司的配置标准并不统一,交付的磁盘挂载的路径不是想要的路径,但是 1./home目录下有很重要的堡垒机登录的相关文件,还不能卸载 2.我通过pts/0登录的,这个文件描述符也是在/home目 ...
- Centos7.3_x86_64通过systemctl控制tomcat8.0.46启动和停止
Centos7.3_x86_64通过systemctl控制tomcat8..46启动和停止 之前在centos 6上通过脚本控制tomcat 启动和停止的脚本,虽然在centos 7也可以使用,但ce ...
- Python2018-列表的相关操作
列表中存放的数据是可以进行修改的,比如"增"."删"."改" .“查” "增"-----append, extend, ...
- PHP程序守护进程化
一般Server程序都是运行在系统后台,这与普通的交互式命令行程序有很大的区别.glibc里有一个函数daemon.调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon ...
- 查看ubuntu版本信息
参考文章:https://blog.csdn.net/qq_27818541/article/details/75207986 版本信息lsb_release -a No LSB modules ar ...
- 一篇文章教你读懂UI绘制流程
最近有好多人问我Android没信心去深造了,找不到好的工作,其实我以一个他们进行回复,发现他们主要是内心比较浮躁,要知道技术行业永远缺少的是高手.建议先阅读浅谈Android发展趋势分析,在工作中, ...