1. Queue 概念

队列 Queue 多应用在多线程应用中,多线程访问共享变量。对于多线程而言,访问共享变量时,队列 Queue 是线程安全的。

Python Queue 模块有三种队列及构造函数:

  1. Python Queue模块的FIFO队列先进先出。
   class Queue.Queue(maxsize)
  1. LIFO类似于堆,即先进后出。
   class Queue.LifoQueue(maxsize)
  1. 还有一种是优先级队列级别越低越先出来。即队列中的元素是一个元祖类型,(优先级级别,数据)。
   class Queue.PriorityQueue(maxsize)

2. Queue 常用的方法

q = Queue.Queue()
函数 说明
q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False),无阻塞的向队列中get任务,当队列为空时,不等待,而是直接抛出empty异常,重点是理解block = False:
q.put(item) 非阻塞写入队列,timeout等待时间
q.put_nowait(item) 相当q.put(item, False),无阻塞的向队列中添加任务,当队列为满时,不等待,而是直接抛出full异常,重点是理解block = False
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 阻塞等待队列中任务全部处理完毕,需要配合queue.task_done使用

重点方法说明:

2.1 get() 方法

from Queue import Queue
Queue.get(self, block=True, timeout=None)

调用队列对象的 get() 方法从队头删除并返回一个项目。可选参数为 block,默认为 True。

  • 如果队列为空且 block 为 True,get() 就使调用线程暂停,直至有项目可用。
  • 如果队列为空且 block 为 False,队列将引发 Empty 异常。

2.2 put() 方法

from Queue import Queue
Queue.put(self, item, block=True, timeout=None)

调用队列对象的 put() 方法在队尾插入一个项目。put() 有三个参数,第一个 item 为必需的,为插入项目的值;第二个 block 为可选参数,默认为 True。

  • 如果队列当前为空且 block 为 True,put() 方法就使调用线程暂停,直到空出一个数据单元。
  • 如果block为 False,put 方法将引发 Full 异常

从上面说明可以看到,当一个队列为空的时候如果再用 get 取则会堵塞,所以取队列的时候一般是用到 get_nowait() 方法,这种方法在向一个空队列取值的时候会抛一个 Empty 异常,所以更常用的方法是先判断一个队列是否为空,如果不为空则取值。

from Queue import Queuemy_queue = Queue(maxsize=10)
# 定义队列时有一个默认的参数maxsize, 如果不指定队列的长度,即maxsize=0,那么队列的长度为无限长,如果定义了大于0的值,那么队列的长度就是maxsize。
a = [1, 2, 3]
my_queue.put(a)
print my_queue.get()
print my_queue.get()    # 再次调用时进程一直未结束,处于等待队列中有值的状态

3. 注意事项

3.1 阻塞模式

import Queueq = Queue.Queue(10)......
for i in range(10):q.put('A')time.sleep(0.5)

这是一段极其简单的代码(另有两个线程也在操作队列 q),我期望每隔 0.5 秒写一个’A’到队列中,但总是不能如愿:间隔时间有时会远远超过 0.5 秒。

原来,Queue.put()默认有 block = True 和 timeout 两个参数。当 block = True 时,写入是阻塞式的,阻塞时间由 timeout 确定。

当队列 q 被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。

3.1 无法捕获 exception Queue.Empty 的异常

while True:......try:data = q.get()except Queue.Empty:break

我的本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点类似:Queue.get()默认的也是阻塞方式读取数据,队列为空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。

参考:

https://blog.csdn.net/zy205817/article/details/51388479

https://blog.csdn.net/yatere/article/details/6668006

Python 标准库之 Queue相关推荐

  1. Python标准库queue模块原理浅析

    Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...

  2. Python标准库介绍

    1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...

  3. Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...

  4. python标准库有多强大_Python标准库——走马观花

    原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的一大好处在于它有一套很有用的标 ...

  5. 10个常用python标准库_【循序渐进学Python】11.常用标准库

    安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...

  6. 5个python标准库及作用_零基础编程——Python标准库使用

    摘要 书接前文: 本文将讲解Python标准库内容,有操作系统接口os.文件路径通配符glob.命令行参数sys.正则表达式re.数学math.日期与时间.数据压缩.性能评估等,我们只需要知道有些什么 ...

  7. python标准库学习笔记

    原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...

  8. Python标准库简介

    很系统的简介了Python标准库的使用方向,对形成知识框架很有帮助. 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python ...

  9. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

最新文章

  1. [置顶] java面试题经典20例【第三季】
  2. debian 下配置common lisp环境
  3. 趣链 BitXHub跨链平台 (2)跨链网络拓扑
  4. 电脑边充电边用好吗_平板电脑充电推车厂家哪家好?
  5. 随着firefox的迭代更新:FireBug不能用了?使用火狐Try Xpath插件替代Firebug和Firepath...
  6. mysql中sex设置男女_MYSQL常用命令(3)
  7. 反转!物联网火爆,开发者却很难入门?
  8. 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根
  9. 2011最新XP系统盘下载大全 都是2011最新的系统
  10. android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
  11. sysdig_Linux 监控和调试利器 Sysdig 入门教程
  12. (standard input): No keywords in input file
  13. 《CSS权威指南》读书笔记10
  14. python-docx原有图片居中
  15. 计算机网络的资源子网,在计算机网络中,资源子网的功能是什么?
  16. 下次激活策略10_陈金凌:年流量1-10万独立站关键词策略案例(1)
  17. Mocking and Stubbing
  18. keras之父《python深度学习》笔记 第六章
  19. C#如何立即回收内存
  20. CMN_1022: [FreeTDS][SQL Server]The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION

热门文章

  1. 2022-2028年中国再生塑料颗粒行业市场全景调查及发展趋势分析报告
  2. 【软件工程】RUP与软件开发5大模型
  3. 机器学习数据不平衡不均衡处理之SMOTE算法实现
  4. 残差复合正态分布的重要性
  5. Pytorch实现MNIST(附SGD、Adam、AdaBound不同优化器下的训练比较) adabound实现
  6. 第三天:Vue的组件化
  7. LeetCode简单题之作为子字符串出现在单词中的字符串数目
  8. CVPR2020论文介绍: 3D 目标检测高效算法
  9. Android动画之帧动画和补间动画
  10. 2021年大数据Flink(四十):​​​​​​​Flink模拟双十一实时大屏统计