第二章:数据结构-queue线程安全的FIFO实现-优先队列
程序员文章站
2024-03-18 08:54:34
...
2.6.3 优先队列
有些情况下,需要根据队列中元素的特性来决定这些元素的处理顺序,而不是简单地采用在队列中创建或插入元素的顺序。例如,工资部门的打印作业可能就优于某个开发人员想要打印的代码清单。PriorityQueue使用队列内容的有序顺序来决定获取哪一个元素。
import functools
import queue
import threading
@functools.total_ordering
class Job:
def __init__(self,priority,description):
self.priority = priority
self.description = description
print('New job:', description)
return
def __eq__(self,other):
try:
return self.priority == other.priority
except AttributeError:
return NotImplemented
def __lt__(self,other):
try:
return self.priority < other.priority
except AttributeError:
return NotImplemented
q = queue.PriorityQueue()
q.put(Job(3, 'Mid-level job'))
q.put(Job(10, 'Low-level job'))
q.put(Job(1, 'Important job'))
def process_job(q):
while True:
next_job = q.get()
print('Processing job:', next_job.description)
q.task_done()
workers = [
threading.Thread(target=process_job, args=(q,)),
#threading.Thread(target=process_job, args=(q,)),
]
for w in workers:
w.setDaemon(True)
w.start()
q.join()
这个例子有多个线程在处理作业,要根据调用get()时队列中元素的优先级来处理。运行消费者线程时,增加到队列的元素的处理顺序取决于线程上下文切换。
运行结果:
上一篇: (三)基本数据结构--队列