如何在Python中创建模拟打印机?

时间:2016-02-18 03:06:38

标签: python printing

我正在尝试使用链接队列模拟打印机来管理打印作业。打印作业将按提交顺序处理,并且有2台打印机。每个打印作业都有多个页面,并将打印机占用用户选择的一定数量的周期。

因此,例如,如果有3个作业,作业1(5页),作业2(7页)和作业3(13页),经过6个周期(打印页),一台打印机就会有作业2剩下1页,另一页上面有3个作业,剩下12页。

我能够处理队列中的2个作业,但我不知道如何处理第三个作业,因为我希望仅在打印机可用时才处理第三个作业。

3 个答案:

答案 0 :(得分:1)

这取决于。你有什么优先考虑你的印刷工作?完成打印作业所需的时间?队列中接收作业的顺序?

如果是后者,那就是这样的:

# printer is a class that contains a state 'idle' and a method 'print'

current_job = None
while ! job_queue.empty():
  if current_job != job_queue.peak(0)
    current_job = job_queue.pop(0)

  if printer1.idle():
    printer1.print_job(current_job)
  elif printer2.idle():
    printer2.print_job(current_job)
  else:
    # do nothing
    pass

  printer1.print()
  printer2.print()

在此基础上,您还可以在打印机类中使用另一个名为“pages_todo”的状态变量,这是一个整数,它告诉您当前打印机对象剩余的页数将其空闲状态更改为true。

class Printer:
  def __init__(self):
    idle = false
    pages_todo = 0

  def print_job(pages):
    pages_todo += pages

  def print():
    pages_todo -= 1 if pages_todo > 0

答案 1 :(得分:1)

我的解决方案使用Queue

实施
class Queue:
    def __init__(self):
        self.items = []
        self.current_task = None

    def isEmpty(self):
        return self.items == []

    def enqueue(self, item):
        # ideally we should enqueue item by item
        self.items = item[1]
        self.current_task = item[0]

    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

job1 = (1, list(range(5)))  # range serves as our list of pages
job2 = (2, list(range(7)))
job3 = (3, list(range(13)))

list_of_jobs = [job3, job2, job1]

# Two printers
printer1 = Queue()
printer2 = Queue()

for _ in range(6):
    if not printer1.isEmpty():
        printer1.dequeue()
    elif list_of_jobs:
        printer1.enqueue(list_of_jobs.pop())
        printer1.dequeue()

    if not printer2.isEmpty():
        printer2.dequeue()
    elif list_of_jobs:
        printer2.enqueue(list_of_jobs.pop())
        printer2.dequeue()

输出

print('printer 1 is working on {} page(s) and is on job {} while printer 2 is working on {} page(s) and is on job {}'.format(printer1.size(), printer1.current_task, printer2.size(), printer2.current_task))

答案 2 :(得分:1)

这是一个很明显的解决方案,你可以找到 - 三个类(PrintJobJobQueuePrinter)和一个main()函数做模拟:

class PrintJob:
    def __init__(self, name, pages):
        self.name = name
        self.pages = pages
        self.remaining = pages

    def tick(self):
        if self.remaining:
            self.remaining -= 1
        print("Job {}: {} / {} pages remain".format(self.name, self.remaining, self.pages))

    def is_done(self):
        return self.remaining == 0

class JobQueue:
    def __init__(self):
        self.jobs = []

    def enqueue(self, job):
        self.jobs.append(job)

    def dequeue(self):
        return self.jobs.pop(0)

    def is_empty(self):
        return not self.jobs

class Printer:
    def __init__(self, name, job_queue):
        self.name = name
        self.job_queue = job_queue
        self.current_job = None

    def tick(self):
        # make sure we have a job to work on
        if self.current_job is None:
            if self.job_queue.is_empty():
                print("Printer {} is idle".format(self.name))
                return
            else:
                self.current_job = self.job_queue.dequeue()
                print("Printer {} got job {}".format(self.name, self.current_job.name))
        # print!
        print("Printer {} is printing...".format(self.name))
        self.current_job.tick()
        # see if job is finished
        if self.current_job.is_done():
            print("Printer {} finished job {}".format(self.name, self.current_job.name))
            self.current_job = None

    def is_idle(self):
        return self.current_job is None

def main():
    # create job queue and two printers
    jobs = JobQueue()
    p1 = Printer(1, jobs)
    p2 = Printer(2, jobs)

    # add jobs
    jobs.enqueue(PrintJob(1, 5))
    jobs.enqueue(PrintJob(2, 7))
    jobs.enqueue(PrintJob(3, 13))

    # cycle until queue is empty
    tick = 0
    while not (jobs.is_empty() and p1.is_idle() and p2.is_idle()):
        tick += 1
        print("\n=== Tick {} ===".format(tick))
        p1.tick()
        p2.tick()

    print("\nAll done! Time for a pint...")

if __name__ == "__main__":
    main()

,最终结果如下

=== Tick 1 ===
Printer 1 got job 1
Printer 1 is printing...
Job 1: 4 / 5 pages remain
Printer 2 got job 2
Printer 2 is printing...
Job 2: 6 / 7 pages remain

=== Tick 2 ===
Printer 1 is printing...
Job 1: 3 / 5 pages remain
Printer 2 is printing...
Job 2: 5 / 7 pages remain

=== Tick 3 ===
Printer 1 is printing...
Job 1: 2 / 5 pages remain
Printer 2 is printing...
Job 2: 4 / 7 pages remain

=== Tick 4 ===
Printer 1 is printing...
Job 1: 1 / 5 pages remain
Printer 2 is printing...
Job 2: 3 / 7 pages remain

=== Tick 5 ===
Printer 1 is printing...
Job 1: 0 / 5 pages remain
Printer 1 finished job 1
Printer 2 is printing...
Job 2: 2 / 7 pages remain

=== Tick 6 ===
Printer 1 got job 3
Printer 1 is printing...
Job 3: 12 / 13 pages remain
Printer 2 is printing...
Job 2: 1 / 7 pages remain

=== Tick 7 ===
Printer 1 is printing...
Job 3: 11 / 13 pages remain
Printer 2 is printing...
Job 2: 0 / 7 pages remain
Printer 2 finished job 2

=== Tick 8 ===
Printer 1 is printing...
Job 3: 10 / 13 pages remain
Printer 2 is idle

=== Tick 9 ===
Printer 1 is printing...
Job 3: 9 / 13 pages remain
Printer 2 is idle

=== Tick 10 ===
Printer 1 is printing...
Job 3: 8 / 13 pages remain
Printer 2 is idle

=== Tick 11 ===
Printer 1 is printing...
Job 3: 7 / 13 pages remain
Printer 2 is idle

=== Tick 12 ===
Printer 1 is printing...
Job 3: 6 / 13 pages remain
Printer 2 is idle

=== Tick 13 ===
Printer 1 is printing...
Job 3: 5 / 13 pages remain
Printer 2 is idle

=== Tick 14 ===
Printer 1 is printing...
Job 3: 4 / 13 pages remain
Printer 2 is idle

=== Tick 15 ===
Printer 1 is printing...
Job 3: 3 / 13 pages remain
Printer 2 is idle

=== Tick 16 ===
Printer 1 is printing...
Job 3: 2 / 13 pages remain
Printer 2 is idle

=== Tick 17 ===
Printer 1 is printing...
Job 3: 1 / 13 pages remain
Printer 2 is idle

=== Tick 18 ===
Printer 1 is printing...
Job 3: 0 / 13 pages remain
Printer 1 finished job 3
Printer 2 is idle

All done! Time for a pint...