欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第二章:数据结构-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()时队列中元素的优先级来处理。运行消费者线程时,增加到队列的元素的处理顺序取决于线程上下文切换。
运行结果:
第二章:数据结构-queue线程安全的FIFO实现-优先队列