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

相關文章
相關標籤/搜索