第二章:数据结构-queue线程安全的FIFO实现-优先队列

本文介绍了一种基于优先级的队列处理机制,通过自定义Job类和使用Python的PriorityQueue,实现不同优先级任务的调度。高优先级任务如重要工作将优先于低优先级任务如普通打印作业得到处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()时队列中元素的优先级来处理。运行消费者线程时,增加到队列的元素的处理顺序取决于线程上下文切换。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值