Python 标准库之 Queue
1. Queue 概念
队列 Queue 多应用在多线程应用中,多线程访问共享变量。对于多线程而言,访问共享变量时,队列 Queue 是线程安全的。
Python Queue 模块有三种队列及构造函数:
- Python Queue模块的FIFO队列先进先出。
class Queue.Queue(maxsize)
- LIFO类似于堆,即先进后出。
class Queue.LifoQueue(maxsize)
- 还有一种是优先级队列级别越低越先出来。即队列中的元素是一个元祖类型,(优先级级别,数据)。
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相关推荐
- Python标准库queue模块原理浅析
Python标准库queue模块原理浅析 本文环境python3.5.2 queue模块的实现思路 作为一个线程安全的队列模块,该模块提供了线程安全的一个队列,该队列底层的实现基于Python线程th ...
- Python标准库介绍
1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...
- Python标准库asyncio模块基本原理浅析
Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...
- python标准库有多强大_Python标准库——走马观花
原文:Python标准库--走马观花 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的一大好处在于它有一套很有用的标 ...
- 10个常用python标准库_【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...
- 5个python标准库及作用_零基础编程——Python标准库使用
摘要 书接前文: 本文将讲解Python标准库内容,有操作系统接口os.文件路径通配符glob.命令行参数sys.正则表达式re.数学math.日期与时间.数据压缩.性能评估等,我们只需要知道有些什么 ...
- python标准库学习笔记
原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...
- Python标准库简介
很系统的简介了Python标准库的使用方向,对形成知识框架很有帮助. 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python ...
- 转--Python标准库之一句话概括
作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...
最新文章
- [置顶] java面试题经典20例【第三季】
- debian 下配置common lisp环境
- 趣链 BitXHub跨链平台 (2)跨链网络拓扑
- 电脑边充电边用好吗_平板电脑充电推车厂家哪家好?
- 随着firefox的迭代更新:FireBug不能用了?使用火狐Try Xpath插件替代Firebug和Firepath...
- mysql中sex设置男女_MYSQL常用命令(3)
- 反转!物联网火爆,开发者却很难入门?
- 盛金公式解一元三次方程_【国际数学竞赛】高次方程求根
- 2011最新XP系统盘下载大全 都是2011最新的系统
- android内部培训视频_第三节(3)_常用控件(ViewPager、日期时间相关、ListView)
- sysdig_Linux 监控和调试利器 Sysdig 入门教程
- (standard input): No keywords in input file
- 《CSS权威指南》读书笔记10
- python-docx原有图片居中
- 计算机网络的资源子网,在计算机网络中,资源子网的功能是什么?
- 下次激活策略10_陈金凌:年流量1-10万独立站关键词策略案例(1)
- Mocking and Stubbing
- keras之父《python深度学习》笔记 第六章
- C#如何立即回收内存
- CMN_1022: [FreeTDS][SQL Server]The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
热门文章
- 2022-2028年中国再生塑料颗粒行业市场全景调查及发展趋势分析报告
- 【软件工程】RUP与软件开发5大模型
- 机器学习数据不平衡不均衡处理之SMOTE算法实现
- 残差复合正态分布的重要性
- Pytorch实现MNIST(附SGD、Adam、AdaBound不同优化器下的训练比较) adabound实现
- 第三天:Vue的组件化
- LeetCode简单题之作为子字符串出现在单词中的字符串数目
- CVPR2020论文介绍: 3D 目标检测高效算法
- Android动画之帧动画和补间动画
- 2021年大数据Flink(四十):​​​​​​​Flink模拟双十一实时大屏统计