打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python数据结构与算法(9)——优先级队列queue例程

https://m.toutiao.com/is/euqcKx5/ 



前言

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

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

基本用法

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

import queueq = 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 queueq = queue.LifoQueue()for i in range(1, 10):    q.put(i)while not q.empty():    print(q.get(), end='  ')

运行之后,效果如下:

优先队列

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

示例如下:

import queueimport threadingclass 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 NotImplementeddef 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()时队列中元素的优先级来处理。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
python数据结构:多线程数据处理,优先级队列--Queue
Python中的元组(Tuple)操作实例详解
9.7.2 队列和优先级队列
Python中的队列PriorityQueue优先级队列 三
python实现线程池
FreeRTOS
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服