首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构-队列Queue

数据结构-队列Queue

原创
作者头像
Swing Dunn
发布2025-10-28 14:49:21
发布2025-10-28 14:49:21
280
举报
文章被收录于专栏:PythonPython

Queue模块是Python内置的标准模块,模块实现了三种类型的队列,它们的区别仅仅是条目取回的顺序,分别由3个类进行表示:

Queue(FifoQueue) : First in first out

LifoQueue : Last in first out

PriorityQueue : 优先队列

1.FifoQueue

先进先出队列:queue.Queue(maxsize= 0)

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

ps: 由于设置que的maxsize为3 ,而循环入列0-3 ,导致3入列的时候,在que.put(i)这里阻塞,而程序无法往下执行

Queue
Queue

ps:设置了是否阻塞,与最长阻塞时间,超出时间队列还是没有空闲位置,则报Full 异常

raise Full
raise Full

2.LifoQueue

后进先出队列 queue.LifoQueue(maxsize = 0)

后进先出
后进先出

3.PriorityQueue

queue.PriorityQueue(maxsize = 0)

优先级队列,按优先级顺序取出元素,级别低的先取出

队列中的元素一般采取元组的形式进行存储(priority_number,data)

按权重从小到大取数据
按权重从小到大取数据

列表也是可以的:

list
list

集合set不太行,集合内是无序的,有时候虽然不报错,但是顺序有误

set
set
  • 优先级一样,数据部分可以比较大小

权重(优先级)相等时,如果数据部分可以比较大小,如列表,字符串,数字等,则按数据部分大小顺序从小到大取值;

如果数据部分无法比较大小,如字典, 则报错

如果想实现字典这类的比较或者改变其他数据类型的比较大小方式

需要自己实现一个类,将数据包装到类中,在类中自定义或

重写def __lt__(self, other):魔法方法,其作用是实现同类对象进行“比较”的方法,在类进行比较的时候可以自动调用

4.常用方法

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

出队列后,队列长度依次减小
出队列后,队列长度依次减小

2.Queue.empty()

队列中是否还有元素,是否为空,为空返回True,否则返回False

3.Queue.full()

队列是否已满, 满 Ture 否 False

4.Queue.put(item, block=True, timeout=None)

将 item 放入队列。

如果可选参数 block 是 true 并且 timeout 是 None (默认),则在必要时阻塞至有空闲插槽可用。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。

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

5.Queue.put_nowait(item)

入队,不等待,相当于 put(item, block=False)。

6.Queue.get(block=Tuer, timeout=None)

从队列中移除并返回一个项目。

如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。

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

7.Queue.get_nowait()

出队列,不等待,相当于 get(block=False) 。

8.Queue.task_done()

在完成一项工作以后,task_done()告诉队列,该任务已处理完成

9.Queue.join()

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

队列添加(put)新工作时,未完成任务的计数就会增一,当调用task_done()函数后,就代表执行完一个工作,未完成任务的计数就会减一,当计数为0时 join() 阻塞被解除。

示例:

1.线性队列 先进先出

2.控制 广度优先遍历

广度优先
广度优先

3.阻塞和线程安全 生产者消费者模式(Producer-Consumer model)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.FifoQueue
  • 2.LifoQueue
  • 3.PriorityQueue
  • 4.常用方法
  • 示例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档