python多线程编程之Queue---put/get 方法的阻塞

python 中,队列是线程间最经常使用的交换数据的形式。Queue模块是提供队列操做的模块,虽然简单易用,可是不当心的话,仍是会出现一些意外。python

1. 阻塞模式致使数据污染spa

import Queue
       q = Queue.Queue(10)
       for 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

相关文章
相关标签/搜索