您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Python隊列Queue怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Python隊列Queue怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
queue模塊是Python內置的標準模塊,模塊實現了三種類型的隊列,它們的區別僅僅是條目取回的順序,分別由3個類進行表示,Queue,LifoQueue,PriorityQueue
先進先出隊列
maxsize 是個整數,用于設置可以放入隊列中的項目數的上限。當達到這個大小的時候,插入操作將阻塞至隊列中的項目被消費掉。如果 maxsize 小于等于零,隊列尺寸為無限大。
from queue import Queue # FIFO queue_obj = Queue() # 創建一個隊列對象 for i in range(4): queue_obj.put(i) while not queue_obj.empty(): print(queue_obj.get()) # 輸出順序 0 1 2 3
后進先出,maxsize和Queue一樣
from queue import Queue,LifoQueue # LIFO queue_obj = LifoQueue() # 創建一個隊列對象 for i in range(4): queue_obj.put(i) while not queue_obj.empty(): print(queue_obj.get()) # 輸出順序 3 2 1 0
優先級隊列構造器,按照級別順序取出元素,級別最低的最先取出
隊列中的元素一般采取元組的形式進行存儲(priority_number, data)
優先級不同數據部分可以比較大小
PriorityQueue_obj = PriorityQueue() PriorityQueue_obj.put((5,45)) PriorityQueue_obj.put((1,42)) PriorityQueue_obj.put((2,47)) while not PriorityQueue_obj.empty(): print(PriorityQueue_obj.get()) # 輸出順序 (1, 42) (2, 47) (5, 45)
優先級一樣,數據部分可以比較大小
priorityQueue_obj = PriorityQueue() priorityQueue_obj.put((1,45)) priorityQueue_obj.put((1,42)) priorityQueue_obj.put((1,47)) while not PriorityQueue_obj.empty(): print(PriorityQueue_obj.get()) (1, 42) (1, 45) (1, 47) priorityQueue_obj = PriorityQueue() priorityQueue_obj.put((1,[1,4])) priorityQueue_obj.put((1,[2,4])) priorityQueue_obj.put((1,[2,3])) while not PriorityQueue_obj.empty(): print(PriorityQueue_obj.get()) (1, [1, 4]) (1, [2, 3]) (1, [2, 4]) 當優先級一樣的時候,會在比較數據部分的大小,同上字符串也可以比較大小,
優先級一樣,數據部分不可以比較大小
報錯
priorityQueue_obj = PriorityQueue() priorityQueue_obj.put((1,{"1":9})) priorityQueue_obj.put((1,{"k":6})) priorityQueue_obj.put((1,{"8":9})) while not priorityQueue_obj.empty(): print(priorityQueue_obj.get()) # 沒有字典不能直接比較大小 # 報錯內容 # TypeError: '<' not supported between instances of 'dict' and 'dict'
如果想實現字典這類的比較或者改變其他數據類型的比較大小方式
需要自己實現一個類,將數據包裝到類中,在類中自定義或
重寫 def __lt__(self, other):
魔法方法,其作用是實現同類對象進行“比較”的方法,在類進行比較的時候可以自動調用
class dic: def __init__(self,level,data): self.level = level self.data = data def __lt__(self, other): if self.level == other.level: return len(self.data)<len(other.data) return self.level < other.level priorityQueue_obj = PriorityQueue() priorityQueue_obj.put(dic(5, {1:4, 2:5})) priorityQueue_obj.put(dic(4, {1:4})) priorityQueue_obj.put(dic(5, {1:2})) while not priorityQueue_obj.empty(): print(priorityQueue_obj.get().data) # 結果 {1: 4} {1: 2} {1: 4, 2: 5}
如果想避免麻煩,避免出現優先級一樣的情況,就省去了一系列的問題
無界的 FIFO 隊列構造函數。簡單的隊列,缺少任務跟蹤等高級功能。
返回隊列的大致大小。
queue_obj = LifoQueue() # 創建一個隊列對象 for i in range(4): queue_obj.put(i) print(queue_obj.qsize()) 結果 1 2 3 4
Queue.empty()
如果隊列為空,返回 True ,否則返回 False 。
Queue.full()
如果隊列是滿的返回 True ,否則返回 False 。
Queue.put(item, block=True, timeout=None)
將 item 放入隊列。如果可選參數 block 是 true 并且 timeout 是 None (默認),則在必要時阻塞至有空閑插槽可用。如果 timeout 是個正數,將最多阻塞 timeout 秒,如果在這段時間沒有可用的空閑插槽,將引發 Full 異常。反之 (block 是 false),如果空閑插槽立即可用,則把 item 放入隊列,否則引發 Full 異常 ( 在這種情況下,timeout 將被忽略)。
Queue.put_nowait(item)
相當于 put(item, block=False)。
Queue.get(block=True, timeout=None)
從隊列中移除并返回一個項目。如果可選參數 block 是 true 并且 timeout 是 None (默認值),則在必要時阻塞至項目可得到。如果 timeout 是個正數,將最多阻塞 timeout 秒,如果在這段時間內項目不能得到,將引發 Empty 異常。反之 (block 是 false) , 如果一個項目立即可得到,則返回一個項目,否則引發 Empty 異常 (這種情況下,timeout 將被忽略)。
Queue.get_nowait()
相當于 get(block=False) 。
Queue.task_done()
在完成一項工作以后,task_done()告訴隊列,該任務已處理完成
Queue.join()
阻塞至隊列中所有的元素都被接收和處理完畢。
隊列添加新工作時,未完成任務的計數就會增一,當調用task_done()函數后,就代表執行完一個工作,未完成任務的計數就會減一,當計數為0時 join() 阻塞被解除。
添加元素發生阻塞
queue_obj = Queue(3) # 隊列的最大長度為3 for i in range(4): # 當向隊列中添加的元素超過隊列的最大長度就會發生阻塞,當隊列中取出一個數據才會解除堵塞 queue_obj.put(i) # print(queue_obj.qsize()) print("阻塞") queue_obj = Queue(3) # 創建一個隊列對象 for i in range(4): queue_obj.put(i,block=False) 當超出最大長度的時就會報錯
取元素發生阻塞
queue_obj = Queue(3) for i in range(3): queue_obj.put(i) for i in range(4): 當取出元素的時候發現沒有元素的時候就會發生阻塞 print(queue_obj.get()) queue_obj = Queue(3) for i in range(3): queue_obj.put(i) for i in range(4): print(queue_obj.get(block=False)) 如果隊列為空,仍然繼續取元素,會發生報錯
超時報錯
queue_obj = Queue(3) for i in range(4): queue_obj.put(i,timeout=4) # 如果阻塞4秒,原隊列中仍然沒有位置,則會發生報錯
其他設置tiemout扽同理,只要超出時間,仍然沒有解決阻塞,就會拋出異常
讀到這里,這篇“Python隊列Queue怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。