我正在尝试使用链接队列模拟打印机来管理打印作业。打印作业将按提交顺序处理,并且有2台打印机。每个打印作业都有多个页面,并将打印机占用用户选择的一定数量的周期。
因此,例如,如果有3个作业,作业1(5页),作业2(7页)和作业3(13页),经过6个周期(打印页),一台打印机就会有作业2剩下1页,另一页上面有3个作业,剩下12页。
我能够处理队列中的2个作业,但我不知道如何处理第三个作业,因为我希望仅在打印机可用时才处理第三个作业。
答案 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)
这是一个很明显的解决方案,你可以找到 - 三个类(PrintJob
,JobQueue
和Printer
)和一个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...