Python之隊列queue模塊使用 常見問題與用法


python 中,隊列是線程間最常用的交換數據的形式。queue模塊是提供隊列操作的模塊,雖然簡單易用,但是不小心的話,還是會出現一些意外。

1. 阻塞模式

import queue

q = queue.Queue(10)  #創建一個隊列

......
       for 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()   清空隊列


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM