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 ...
随机推荐
- Maya API Test
import maya.OpenMaya as OpenMaya import maya.OpenMayaMPx as OpenMayaMPx sl = OpenMaya.MSelectionList ...
- Qt学习之路
Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt ...
- 使用C++编写linux多线程程序
前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...
- 压缩JS的eclipse插件
主页:http://jscompressor.oncereply.me/ Update site: http://jscompressor.oncereply.me/update/
- 二、消息队列之如何在C#中使用RabbitMQ
1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...
- 执行原生SQL语句的方式
原生sql语句 cursor方法:from api.models import *from django.db import connection,connectionscursor=connecti ...
- Struts2配置拦截器
<package name="loginaction" namespace="/" extends="struts-default"& ...
- Tornado学习笔记(二) 路由/post/get传参
本章我们学习 Tornado 的路由传参等问题 路由 路由的匹配 Tornado的路由匹配采用的是正则匹配 一般情况下不需要多复杂的正则,正则的基本规则如下(站长之家) 举个例子 (r'/sum/(\ ...
- 21)django-csrf(跨站请求伪造)
一:目录 1)简介及无CSRF时存在隐患 2)csrf原理 3)csrf 设置 4)Form提交(CSRF) 5)Ajax提交(CSRF) CSRF请求头 X-CSRFToken 二:csrf简介 c ...
- Android:双击退出应用的实现
1 需求效果 为了防止用户点击返回键就直接退出APP,通常会加入一个双击退出的要求. 如果用户在两秒之内重复点击了返回键,则执行退出操作:如果用户点击了一次返回键之后,超过两秒未再次点击,则不响应退出 ...