网络编程
位置:首页>> 网络编程>> Python编程>> Python数据结构之优先级队列queue用法详解

Python数据结构之优先级队列queue用法详解

作者:李元静  发布时间:2023-03-10 03:37:40 

标签:Python,优先级队列,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="  ")

运行之后,效果如下:

Python数据结构之优先级队列queue用法详解

这里我们依次添加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="  ")

运行之后,效果如下:

Python数据结构之优先级队列queue用法详解

三、优先队列

在操作系统中,我们常常会根据优先级来处理任务,比如系统的优先级最高,我们肯定优先处理系统任务,然后才处理用户的任务。同样,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()

运行之后,效果如下:

Python数据结构之优先级队列queue用法详解

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

来源:https://blog.csdn.net/liyuanjinglyj/article/details/115837391

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com