文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python数据结构之队列

2024-12-03 01:18

关注

python内置的queue模块实现了三种类型的队列,因此没有必要重复造轮子,它们的区别仅仅是条目取回的顺序。在 FIFO 队列中,先添加的任务先取回。在 LIFO 队列中,最近被添加的条目先取回(操作类似一个堆栈)。优先级队列中,条目将保持排序( 使用 heapq 模块 ) 并且最小值的条目第一个返回。

  1. class queue.Queue(maxsize=0) 

FIFO 先入先出队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

  1. maxsize is an integer that sets the upperbound limit on the number of items that can be placed in the queue.  
  2. class queue.LifoQueue(maxsize=0) 

LIFO 后入先出队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

  1. class queue.PriorityQueue(maxsize=0) 

PriorityQueue优先级队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

通用方法:

Queue.qsize() 返回队列的大致大小

Queue.empty() 如果队列为空,返回 True ,否则返回 False 。

Queue.full() 如果队列是满的返回 True ,否则返回 False 。

Queue.put(item, block=True, timeout=None) 将 item 放入队列。

如果可选参数 block 是 true 并且 timeout 是 None (默认),则在必要时阻塞至有空闲插槽可用。

如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。

反之 (block 是 false),如果空闲插槽立即可用,则把 item 放入队列,否则引发 Full 异常 ( 在这种情况下,timeout 将被忽略)。

Queue.put_nowait(item) 相当于 put(item, False) 。

Queue.get(block=True, timeout=None) 从队列中移除并返回一个项目。

如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。

如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。

反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。

Queue.get_nowait() 相当于 get(False) 。

提供了两个方法,用于支持跟踪 排队的任务 是否 被守护的消费者线程 完整的处理。

  1. Queue.task_done() 

表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。

如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。

如果被调用的次数多于放入队列中的项目数量,将引发 ValueError 异常 。

  1. Queue.join() 

阻塞至队列中所有的元素都被接收和处理完毕。

当条目添加到队列的时候,未完成任务的计数就会增加。

每当消费者线程调用 task_done() 表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。

当未完成计数降到零的时候, join() 阻塞被解除。

代码如下:

  1. #!/usr/bin/env python 
  2. # -*- coding: UTF-8 -*- 
  3. #                     _ooOoo_ 
  4. #                   o8888888o 
  5. #                    88" . "88 
  6. #                 ( | -  _  - | ) 
  7. #                     O\ = /O 
  8. #                 ____/`---'\____ 
  9. #                  .' \\| |// `. 
  10. #                 / \\|||:|||// \ 
  11. #               / _|||||-:- |||||- \ 
  12. #                | | \\\ - /// | | 
  13. #              | \_| ''\---/'' | _/ | 
  14. #               \ .-\__ `-` ___/-. / 
  15. #            ___`. .' /--.--\ `. . __ 
  16. #         ."" '< `.___\_<|>_/___.' >'""
  17. #       | | : `- \`.;`\  _ /`;.`/ - ` : | | 
  18. #          \ \ `-. \_ __\ /__ _/ .-` / / 
  19. #      ==`-.____`-.___\_____/___.-`____.-'== 
  20. #                     `=---=' 
  21. ''
  22. @Project :pythonalgorithms  
  23. @File :queuedatastructure.py 
  24. @Author :不胜人生一场醉 
  25. @Date :2021/7/15 1:53  
  26. ''
  27. from queue import Queue, LifoQueue, PriorityQueue, SimpleQueue 
  28. import random 
  29.  
  30. if __name__ == '__main__'
  31.     q = Queue()  # 先进先出队列 
  32.     lq = LifoQueue()  # 先进后厨队列 
  33.     pq = PriorityQueue()  # 优先级队列 
  34.     sq = SimpleQueue()  # 简单队列 
  35.     # 插入队列数据 
  36.     for i in range(10): 
  37.         q.put(i) 
  38.         lq.put(i) 
  39.         pq.put(random.randint(1, 20), i) 
  40.         sq.put(i) 
  41.     for i in range(10): 
  42.         print(q.get(), end=' '
  43.     # 0 1 2 3 4 5 6 7 8 9  
  44.     print('\r'
  45.     for i in range(10): 
  46.         print(lq.get(), end=' '
  47.     # 9 8 7 6 5 4 3 2 1 0  
  48.     print('\r'
  49.     for i in range(10): 
  50.         print(pq.get(), end=' '
  51.     # 6 7 13 16 17 18 18 19 20 20  
  52.     print('\r'
  53.     for i in range(10): 
  54.         print(sq.get(), end=' '
  55.     # 0 1 2 3 4 5 6 7 8 9  
  56.  
  57.     q = Queue(3) 
  58.     print('\r'
  59.     print('queue.qsize=', q.qsize()) 
  60.     # queue.qsize= 0 
  61.     print('queue.empty=', q.empty()) 
  62.     # queue.empty= True 
  63.     q.put(5) 
  64.     q.put(9) 
  65.     q.put(1) 
  66.     print('queue.full=', q.full()) 
  67.     # queue.fullTrue 
  68.     # q.put(10) 
  69.     # print(q) 
  70.     # q.put(11,block=True,timeout=1)  #在timeout=1秒左右,返回 raise Full 
  71.     # print(q) 
  72.     # q.put(11, block=False, timeout=1)  # 立刻 返回 raise Full,忽略时间 
  73.     # print(q) 

输出结果为:

 

来源:python与大数据分析内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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