当前位置:首页 > 域名

Python数据结构与算法—优先级队列Queue

前言

queue库提供了一个适用于多线程编程的数据算法先进先出(FIFO)数据结构,可以用来在生产者与消费者线程之间安全地传递消息或其他数据。结构级队

它会为调用者处理锁定,优先使多个线程可以安全而更容易地处理同一个Queue实例。数据算法Queue的结构级队大小可能受限,以限制内存使用或处理。优先

基本用法

Queue类实现了一个基本的数据算法先进先出容器。使用put()将元素增加到这个序列的结构级队一端,使用get()从另一端删除。优先具体代码如下所示:

import queue q = queue.Queue() for i in range(1,数据算法 10):     q.put(i) while not q.empty():     print(q.get(), end="  ") 

 运行之后,效果如下:

这里我们依次添加1到10到队列中,结构级队因为先进先出,云服务器提供商优先所以出来的数据算法顺序也与添加的顺序相同。

LIFO队列

既然有先进先出队列queue,结构级队那么数据结构中肯定也有后进先出的优先队列。后进先出的队列为:LifoQueue,示例如下:

import queue q = queue.LifoQueue() for i in range(1, 10):     q.put(i) while not q.empty():     print(q.get(), end="  ") 

 运行之后,效果如下:

 

优先队列

在操作系统中,我们常常会根据优先级来处理任务,比如系统的优先级最高,我们肯定优先处理系统任务,然后才处理用户的站群服务器任务。同样,queue库给我们提供了PriorityQueue来处理优先级的队列。

示例如下:

import queue import threading class Job:     def __init__(self, priority, desc):         self.priority = priority         self.desc = desc         print("New Job:", desc)         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 def process_Job(q):     while True:         next_job = q.get()         print(next_job.desc)         q.task_done() q = queue.PriorityQueue() q.put(Job(5, "Five Job")) q.put(Job(15, "Fifteen Job")) q.put(Job(1, "One Job")) workers = [     threading.Thread(target=process_Job, args=(q,)),     threading.Thread(target=process_Job, args=(q,)), ] for work in workers:     work.setDaemon(True)     work.start() q.join() 

 运行之后,效果如下:

这里,我们默认数值越大优先级越高,可以看到15先执行,然后再是5,1任务。这个例子展现了有多个线程在处理任务时,要根据get()时队列中元素的优先级来处理。

亿华云

分享到:

滇ICP备2023006006号-16