按书里的样例抄的。

可以看到,将打印速度由第分钟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. Maya API Test

    import maya.OpenMaya as OpenMaya import maya.OpenMayaMPx as OpenMayaMPx sl = OpenMaya.MSelectionList ...

  2. Qt学习之路

      Qt学习之路_14(简易音乐播放器)   Qt学习之路_13(简易俄罗斯方块)   Qt学习之路_12(简易数据管理系统)   Qt学习之路_11(简易多文档编辑器)   Qt学习之路_10(Qt ...

  3. 使用C++编写linux多线程程序

    前言 在这个多核时代,如何充分利用每个 CPU 内核是一个绕不开的话题,从需要为成千上万的用户同时提供服务的服务端应用程序,到需要同时打开十几个页面,每个页面都有几十上百个链接的 web 浏览器应用程 ...

  4. 压缩JS的eclipse插件

    主页:http://jscompressor.oncereply.me/ Update site: http://jscompressor.oncereply.me/update/

  5. 二、消息队列之如何在C#中使用RabbitMQ

    1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...

  6. 执行原生SQL语句的方式

    原生sql语句 cursor方法:from api.models import *from django.db import connection,connectionscursor=connecti ...

  7. Struts2配置拦截器

    <package name="loginaction" namespace="/" extends="struts-default"& ...

  8. Tornado学习笔记(二) 路由/post/get传参

    本章我们学习 Tornado 的路由传参等问题 路由 路由的匹配 Tornado的路由匹配采用的是正则匹配 一般情况下不需要多复杂的正则,正则的基本规则如下(站长之家) 举个例子 (r'/sum/(\ ...

  9. 21)django-csrf(跨站请求伪造)

    一:目录 1)简介及无CSRF时存在隐患 2)csrf原理 3)csrf 设置 4)Form提交(CSRF) 5)Ajax提交(CSRF) CSRF请求头 X-CSRFToken 二:csrf简介 c ...

  10. Android:双击退出应用的实现

    1 需求效果 为了防止用户点击返回键就直接退出APP,通常会加入一个双击退出的要求. 如果用户在两秒之内重复点击了返回键,则执行退出操作:如果用户点击了一次返回键之后,超过两秒未再次点击,则不响应退出 ...