python 中,队列是线程间最经常使用的交换数据的形式。Queue模块是提供队列操做的模块,虽然简单易用,可是不当心的话,仍是会出现一些意外。python
1. 阻塞模式致使数据污染spa
import Queue
q = Queue.Queue(10)
for i in range(10):
myData = 'A'
q.put(myData)
myData = 'B'线程
这是一段极其简单的代码,但我老是不能得到指望的结果(指望在队列中写入10个A,却老是混杂了B)。原来,Queue.put()默认有 block = True 和 timeou 两个参数。当 block = True 时,写入是阻塞式的,阻塞时间由 timeou 肯定。正由于阻塞,才致使了后来的赋值污染了处于阻塞状态的数据。Queue.put()方法加上 block=False 的参数,便可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。队列
2. 没法捕获 exception Queue.Empty 的异常get
while True:
......
try:
data = q.get()
except Queue.Empty:
breakit
个人本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点相似:Queue.get()默认的也是阻塞方式读取数据,队列为空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。io
3. Queue经常使用方法汇总import
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() 清空队列exception