Queue 简介

Queue 叫队列,是数据结构中的一种,基本上所有成熟的编程语言都内置了对 Queue 的支持。

Python 中的 Queue 模块实现了多生产者和多消费者模型,当需要在多线程编程中非常实用。而且该模块中的 Queue 类实现了锁原语,不需要再考虑多线程安全问题

该模块内置了三种类型的 Queue,分别是class queue.Queue(maxsize=0),class queue.LifoQueue(maxsize=0)和class queue.PriorityQueue(maxsize=0)。它们三个的区别仅仅是取出时的顺序不一致而已。

Queue 是一个 FIFO 队列,任务按照添加的顺序被取出。

LifoQueue 是一个 LIFO 队列,类似堆栈,后添加的任务先被取出。

PriorityQueue 是一个优先级队列,队列里面的任务按照优先级排序,优先级高的先被取出。

Queue 常用操作

类和异常

1 class queue.Queue(maxsize=0)2 class queue.LifoQueue(maxsize=0)3 class queue.PriorityQueue(maxsize=0)

如你所见,就是上面所说的三种不同类型的内置队列,其中 maxsize 是个整数,用于设置可以放入队列中的任务数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的任务被消费掉。如果 maxsize 小于等于零,则队列尺寸为无限大。

1 exception queue.Empty2 #对空的 Queue 对象调用非阻塞的 get() (or get_nowait()) 时,会引发该异常。

3

4 exception queue.Full5 #对满的 Queue 对象调用非阻塞的 put() (or put_nowait()) 时,会引发该异常。

常用操作

添加任务

向队列中添加任务,直接调用put()函数即可

1 importqueue2 >>> q = queue.Queue(maxsize=1)3 >>> q.put(100)

put()函数完整的函数签名如下Queue.put(item, block=True, timeout=None),如你所见,该函数有两个可选参数。

默认情况下,在队列满时,该函数会一直阻塞,直到队列中有空余的位置可以添加任务为止。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有空余的位置出来,则会引发Full异常。

1 >>> importqueue2 >>> q = queue.Queue(maxsize=1)3 >>> q.put(100)4 >>> q.put(100,True,2)5 Traceback (most recent call last):6 File "", line 1, in

7 File "E:\Python37-32\lib\queue.py", line 147, input8 raiseFull9 queue.Full #创建一个容量为 1 的队列,2 秒内没有位置添加任务则引发 Full 异常

10 >>> q.put(100) #该方法会一直阻塞

当 block 为 false 时,timeout 参数将失效。同时如果队列中没有空余的位置可添加任务则会引发Full异常,否则会直接把任务放入队列并返回,不会阻塞。

1 >>> importqueue2 >>> q = queue.Queue(maxsize=1)3 >>> q.put(100)4 >>> q.put(100,False,2)5 Traceback (most recent call last):6 File "", line 1, in

7 File "E:\Python37-32\lib\queue.py", line 136, input8 raiseFull9 queue.Full10 #创建一个容量为 1 的队列,在第二次放入任务时指定为非阻塞模式,则会立刻引发 Full 异常

另外,还可以通过Queue.put_nowait(item)来添加任务,相当于Queue.put(item, False),不再赘述。同样,在队列满时,该操作会引发Full异常。

获取任务

从队列中获取任务,直接调用get()函数即可

1 >>> importqueue2 >>> q =queue.Queue()3 >>> q.put(100)4 >>>q.get()5 100

与put()函数一样,get()函数也有两个可选参数,完整签名如下Queue.get(block=True, timeout=None)。

默认情况下,当队列空时调用该函数会一直阻塞,直到队列中有任务可获取为止。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有任务可获取,则会引发Empty异常。

1 >>> importqueue2 >>> q =queue.Queue()3 >>> q.put(100)4 >>>q.get()5 100

6 >>> q.get(True,2)7 Traceback (most recent call last):8 File "", line 1, in

9 File "E:\Python37-32\lib\queue.py", line 178, inget10 raiseEmpty11 _queue.Empty #2 秒钟内没有任务可获取则引发 Empty 异常

12 >>> q.get() #该方法会一直阻塞

当 block 为 false 时,timeout 参数将失效。同时如果队列中没有任务可获取则会立刻引发Empty异常,否则会直接获取一个任务并返回,不会阻塞。

1 >>> importqueue2 >>> q =queue.Queue()3 >>> q.put(100)4 >>>q.get()5 100

6 >>> q.get(False,2)7 Traceback (most recent call last):8 File "", line 1, in

9 File "E:\Python37-32\lib\queue.py", line 167, inget10 raiseEmpty11 _queue.Empty12 #指定为非阻塞模式,队列为空则立即引发 Empty 异常

另外,还可以通过Queue.get_nowait()来获取任务,相当于Queue.get(False),不再赘述。同样,在队列为空时,该操作会引发Empty异常。

其他常用方法

获取队列大小

1 >>> importqueue2 >>> q =queue.Queue()3 >>> q.put(100)4 >>> q.put(200)5 >>>q.qsize()6 2

判断队列是否空

如果队列为空,返回True,否则返回False。如果 empty() 返回True,不保证后续调用的 put() 不被阻塞。类似的,如果 empty() 返回False,也不保证后续调用的 get() 不被阻塞。

判断队列是否满

如果队列是满的返回True,否则返回False。如果 full() 返回True不保证后续调用的 get() 不被阻塞。类似的,如果 full() 返回False也不保证后续调用的 put() 不被阻塞。

1 >>> importqueue2 >>> q = queue.Queue(maxsize=1)3 >>>q.empty()4 True5 >>>q.full()6 False7 >>> q.put(100)8 >>>q.empty()9 False10 >>>q.full()11 True

队列对比

FIFO 队列

queue.Queue()是 FIFO 队列,出队顺序跟入队顺序是一致的。

1 importqueue2 q =queue.Queue()3 for index in range(10):4 q.put(index)5 while notq.empty():6 print(q.get(), end=",")7 ## 输出结果如下

8 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

LIFO 队列

queue.LifoQueue()是 LIFO 队列,出队顺序跟入队顺序是完全相反的,类似于栈。

importqueue

q= queue.LifoQueue() #创建一个 LIFO 队列

for index in range(10):

q.put(index)while notq.empty():print(q.get(), end=",")## 输出结果如下

9, 8, 7, 6, 5, 4, 3, 2, 1, 0,

优先级队列

优先级队列中的任务顺序跟放入时的顺序是无关的,而是按照任务的大小来排序,最小值先被取出。那任务比较大小的规则是怎么样的呢。

如果是内置类型,比如数值或者字符串,则按照自然顺序来比较排序。

importqueue

q=queue.PriorityQueue()for index in range(10,0,-1):

q.put(index)while notq.empty():print(q.get(), end=",")## 输出结果如下

1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

如果是列表或者元祖,则先比较第一个元素,然后比较第二个,以此类推,直到比较出结果

importqueue

q=queue.PriorityQueue()

q.put(["d","b"])

q.put(["c","b"])while notq.empty():print(q.get(), end=",")## 输出结果如下

['c', 'b'], ['d', 'b'],

注意,因为列表的比较对规则是按照下标顺序来比较的,所以在没有比较出大小之前 ,队列中所有列表对应下标位置的元素类型要一致。

好比[2,1]和["1","b"]因为第一个位置的元素类型不一样,所以是没有办法比较大小的,所以也就放入不了优先级队列。

然而对于[2,1]和[1,"b"]来说即使第二个元素的类型不一致也是可以放入优先级队列的,因为只需要比较第一个位置元素的大小就可以比较出结果了,就不需要比较第二个位置元素的大小了。

但是对于[2,1]和 1[2,"b"]来说,则同样不可以放入优先级队列,因为需要比较第二个位置的元素才可以比较出结果,然而第二个位置的元素类型是不一致的,无法比较大小。

综上,也就是说,直到在比较出结果之前,对应下标位置的元素类型都是需要一致的。

如果是自定义类型,需要实现__lt__比较函数

下面我们自定义一个动物类型,希望按照年龄大小来做优先级排序。年龄越小优先级越高。

importqueue

q=queue.PriorityQueue()classAnimal:def __init__(self, age, name):

self.age=age

self.name=namedef __lt__(self, other): #实现 < 操作

return self.age < other.age #如果将 < 变成 > 则相当于逆序

q.put(Animal(3,"cat"))

q.put(Animal(2,"dog"))while notq.empty():

animal=q.get()print(animal.name, animal.age, end=",")## 输出结果如下

dog 2, cat 3,

python queue_Python-Queue 入门相关推荐

  1. Python 进程间通信 Queue / Pipe - Python零基础入门教程

    目录 一.前言 1.使用 Queue 线程间通信 2.使用 Queue 进程间通信,适用于多个进程之间通信 3.使用 Pipe 进程间通信,适用于两个进程之间通信(一对一) 二.python 进程间通 ...

  2. Python help 函数 - Python零基础入门教程

    目录 一.Python help 函数简介 二.Python help 函数使用 1.查看内置函数的帮助信息 2.查看数据类型的帮助信息 三.猜你喜欢 基础 Python 学习路线推荐 : Pytho ...

  3. Python next 函数 - Python零基础入门教程

    目录 一.Python next 函数简介 二.Python next 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 ...

  4. Python oct 函数 - Python零基础入门教程

    目录 一.Python oct 函数简介 二.Python oct 函数使用 1.Python chr 函数将 ascll 码转为字符 2.Python ord 函数将字符转为 ascll 码 三.猜 ...

  5. Python min 函数 - Python零基础入门教程

    目录 一.Python min 函数简介 二.Python min 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一. ...

  6. Python reload 函数 - Python零基础入门教程

    目录 一.Python reload 函数简介 二.Python reload 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基 ...

  7. Python max 函数 - Python零基础入门教程

    目录 一.Python max 函数简介 二.Python max 函数使用 三.猜你喜欢 基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一. ...

  8. Python globals 函数 - Python零基础入门教程

    目录 一.Python globals 函数语法 二.Python globals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho ...

  9. Python locals 函数 - Python零基础入门教程

    目录 一.locals 函数语法 二.locals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.locals ...

  10. Python reduce 函数 - Python零基础入门教程

    目录 一.Python reduce 函数简介 1.reduce 函数语法 2.reduce 函数原理 二.Python reduce 函数使用 1.reduce 函数普通使用 2.reduce 函数 ...

最新文章

  1. 二叉树中和为某一值的路径
  2. 调用bat文件执行java文件
  3. sqlalchemy.exc.DataError: (pymysql.err.DataError) (1366, “Incorrect string value: ‘\\xE6问题解决
  4. 高校竞赛排行榜主办方数据上传 操作手册
  5. mysql 8.0免安装配置_Mysql8.0免安装包配置方法
  6. Linux 学习记录 四(Bash 和 Shell scirpt).
  7. 用科幻艺术描绘未知的魅力-人物篇
  8. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)
  9. OkHttp上传Json嵌套对象
  10. 让python脚本像普通程序一样运行
  11. oracle rank 语法_oracle rank函数怎么用
  12. wordcount java分析_JavaWordCount
  13. springcloud服务网关Netflix Zuul入门简介
  14. [AWDwR4] No JQuery call matches [:html, #cart]
  15. 如何将地址栏打开的图标隐藏_如何制作一款手机主题?这套UI主题图标教程将为你解密!...
  16. sql多行插入insert多行无法分析查询文本_收藏!SQL语法全集合!
  17. 洪水填充算法_区域填充算法和多边形填充的扫描线算法
  18. ubuntu下搜狗拼音输入法不见了
  19. MySQL服务无法启动,服务没有报告任何错误--解决方案
  20. 技嘉B460M小雕板win2012 R2安装网卡驱动

热门文章

  1. 实战项目五:抓取简书文章信息
  2. 机器学习第5天:逻辑回归
  3. 解决JavaWeb项目代码报错
  4. 原理+实践,Kafka MirrorMaker使用与性能调优全解析
  5. HTTPS从认识到线上实战全记录
  6. 看懂mysql执行计划--官方文档
  7. solr源码分析之solrclound
  8. mysql 存储过程项目小结
  9. 开发环境下jboss 7.1.1 Final 的jsp热部署解决方案--转
  10. 【机器学习】--模型评估指标之混淆矩阵,ROC曲线和AUC面积