gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:55:07 25 4
gpt4 key购买 nike

我正在尝试使用链接队列来模拟打印机来管理打印作业。一个打印作业会按照提交的先后顺序进行处理,有2台打印机。每个打印作业都有多个页面,并且会在用户选择的特定循环次数内占用打印机。

因此,例如,如果有 3 个作业,作业 1(5 页)、作业 2(7 页)和作业 3(13 页),在 6 个循环(打印页)之后,一台打印机将打印作业 2还剩 1 页,另一个将有作业 3,还剩 12 页。

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

最佳答案

这是您所能找到的最清晰的解决方案 - 三个类(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...

关于python - 如何在 Python 中创建模拟打印机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35472058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com