文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 03:44

关注

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

基本用法

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

  1. import queue 
  2.  
  3. q = queue.Queue() 
  4.  
  5. for i in range(1, 10): 
  6.     q.put(i) 
  7. while not q.empty(): 
  8.     print(q.get(), end="  "

 运行之后,效果如下:

这里我们依次添加1到10到队列中,因为先进先出,所以出来的顺序也与添加的顺序相同。

LIFO队列

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

  1. import queue 
  2.  
  3. q = queue.LifoQueue() 
  4.  
  5. for i in range(1, 10): 
  6.     q.put(i) 
  7. while not q.empty(): 
  8.     print(q.get(), end="  "

 运行之后,效果如下:

 

优先队列

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

示例如下:

  1. import queue 
  2. import threading 
  3.  
  4. class Job: 
  5.     def __init__(self, priority, desc): 
  6.         self.priority = priority 
  7.         self.desc = desc 
  8.         print("New Job:"desc
  9.         return 
  10.  
  11.     def __eq__(self, other): 
  12.         try: 
  13.             return self.priority == other.priority 
  14.         except AttributeError: 
  15.             return NotImplemented 
  16.  
  17.     def __lt__(self, other): 
  18.         try: 
  19.             return self.priority > other.priority 
  20.         except AttributeError: 
  21.             return NotImplemented 
  22.  
  23. def process_Job(q): 
  24.     while True
  25.         next_job = q.get() 
  26.         print(next_job.desc
  27.         q.task_done() 
  28.  
  29. q = queue.PriorityQueue() 
  30.  
  31. q.put(Job(5, "Five Job")) 
  32. q.put(Job(15, "Fifteen Job")) 
  33. q.put(Job(1, "One Job")) 
  34.  
  35. workers = [ 
  36.     threading.Thread(target=process_Job, args=(q,)), 
  37.     threading.Thread(target=process_Job, args=(q,)), 
  38.  
  39. for work in workers: 
  40.     work.setDaemon(True
  41.     work.start() 
  42.  
  43. q.join() 

 运行之后,效果如下:

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

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯