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 ...
随机推荐
- delphi 控件集
delphi 控件集: 1)RAIZE 控件包 :http://www.raize.com/devtools/rzcomps/ 被收购 Raize Components has been ac ...
- 新版本微信导致的ios表单bug
解决方法如下: $(document).delegate('input, textarea, select', 'blur', function(){ setTimeout(function(){ $ ...
- python类的内建方法
研究email源码学到的 class test(): """Class for generating text/* type MIME documents."& ...
- 移动硬盘和u盘的区别
移动硬盘和U盘都属于便携性存储器,用于计算机之间的数据交换.但移动硬盘和U盘的区别还是非常大的,包括内部构造.容量以及整体外观上. 移动硬盘又分为机械移动硬盘和固态移动硬盘两种,主要区别在于内置的存储 ...
- centos6.9安装crontab
yum install vixie-cron crontabs //安装 chkconfig crond on //开机自启动 service crond start //启动 然后就是执行 cron ...
- TIMESTAMPN(N) WITH LOCAL TIMEZONE数据类型转换
--TYPE#=231为TIMESTAMP(N) WITH LOCAL TIME ZONE,181为TIMESTAMP(N) WITH TIME ZONEselect u.name || '.' || ...
- sleep()和wait()的区别及wait方法的一点注意事项
一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时间会自动恢复,调用sleep方法不会释放锁对象. 当调用sleep方 ...
- oracle 的sqlplus 工具进行翻译的rlwrap 安装教程
一:下载地址: 链接: https://share.weiyun.com/50R5pBb (密码:dQPc) 或者该QQ群下载: 二:该工具的安装步骤: [oracle@localhost ~]$ l ...
- Confluence 6 指定日志选项和已知问题
指定 Confluence 日志选项 这里是一些特定的日志配置,你可能在对问题进行调试的时候需要. 在日志中记录数据库使用的 SQL 查询请求 你可能希望增加日志的中的内容,记录 Confluence ...
- Confluence 6 恢复一个空间
你可以导出一个空间 – 包括页面,评论和附件到一个压缩的 XML 文件中,可选的你可以在 XML 文件中包括所有空间使用的附件.希望导入空间到其他的 Confluence 站点中,请按照下面的方法进行 ...