Python之队列queue模块使用 常见问题与用法
来源:互联网 发布:算法导论 22.3 10 编辑:程序博客网 时间:2024/06/07 12:44
python 中,队列是线程间最常用的交换数据的形式。queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。
1. 阻塞模式
import queue
q = 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 和 timeou 两个参数。当 block = True 时,写入是阻塞式的,阻塞时间由 timeou 确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。
2. 无法捕获 exception Queue.Empty 的异常
while True:
......
try:
data = q.get()
except Queue.Empty:
break
我的本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点类似:Queue.get()默认的也是阻塞方式读取数据,队列为空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。
3. Queue常用方法汇总
Queue.Queue(maxsize=0) FIFO, 如果maxsize小于1就表示队列长度无限
Queue.LifoQueue(maxsize=0) LIFO, 如果maxsize小于1就表示队列长度无限
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 读队列,timeout等待时间
Queue.put(item, [block[, timeout]]) 写队列,timeout等待时间
Queue.queue.clear() 清空队列
- Python之队列queue模块使用 常见问题与用法
- Python队列Queue模块
- python队列queue模块详解
- Python之Queue模块使用心得
- python之Queue模块
- python学习之队列(Queue)
- python使用queue队列实现生产者消费者
- Python模块介绍之base64模块、Queue模块
- [Python] python Queue模块
- Java数据结构与算法之Queue队列
- stl之queue(队列)的使用
- STL库之queue队列使用
- python Queue队列例子
- python队列Queue
- Python队列Queue
- python队列Queue
- python队列Queue
- STL 之 stack&queue&priority_queue 栈,队列与优先队列
- js循环添加onclick事件
- 机器学习数据来源总结(不断积累更新)
- unity3D-游戏/AR/VR在线就业班 蓝鸥C#入门字典学习笔记
- 8面向对象高级--->@property
- adb logcat常用命令小结
- Python之队列queue模块使用 常见问题与用法
- [C语言][LeetCode][232]Implement Queue using Stacks
- AS400 DB2 SQL常用函数总结
- LeetCode - Validate Binary Search Tree
- Linux下使用math函数
- LVS
- 最长公共子序列LCS和最长回文子序列的动态规划算法
- unity3D-游戏/AR/VR在线就业班 蓝鸥C#入门栈和队列学习笔记
- Nginx+iis 负载均衡