按书里的样例抄的。

可以看到,将打印速度由第分钟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--使用队列结构来模拟共享打印机等候时间的更多相关文章

  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. Java基础6-多态;匿名内部类;适配器模式

    昨日内容回顾 类成员 构造函数:和类同名,没有返回值,可以重载 this(),super() 成员变量: 成员函数: 静态代码块:类加载执行 {}:构造代码块 interface 所有方法都是抽象的 ...

  2. cef_binary_3.2623.1401.gb90a3be

    这个资源现在很难搜索到 分享给大家 http://www.ceffans.com/forum.php?mod=viewthread&tid=9 http://pan.baidu.com/sha ...

  3. input修改placeholder文字颜色

    少废话,上代码: <style> input::-webkit-input-placeholder{ color:red; } input::-moz-placeholder{ /* Mo ...

  4. 制作ecc证书(linux命令行)

    生成ECC证书.Debian:/home/test# openssl ecparam -out EccCA.key -name prime256v1 -genkeyDebian:/home/test# ...

  5. Golang channel 特性

    最近在项目中遇到了 Go channel 的一些问题,在此记录下 close channel 的一些特性. 关闭channel ch := make(chan bool) close(ch) clos ...

  6. PHP程序守护进程化

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

  7. 请在微信客户端打开链接 html

    1 前言 有时候,需要链接只能在微信上打开,如果不是,则提示请在微信客户端打开链接的字眼的网页,网页代码如下:(这个是网页应用授权时,非微信上打开,就会出现,然后把它单独拿出来了) 2 代码 < ...

  8. layui前端框架

    项目中需要弹出层效果,使用了layui前端框架,主要使用了里面的弹出层特效(可以移动) html代码 要给这个标签绑定click方法 <a href='javascript:;' data-me ...

  9. css3 曲线阴影,翘边阴影

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 对象Object

    功能分类                       1. 创建对象 把各对数自身拥有的可枚举属性复制到第一个对象并返回:obj = Object.assign(o1, o2, o3),o1=obj ...