Python 的佇列模組中的棧和佇列
在 Python 中,實現棧和佇列資料結構非常容易。棧被稱為 LIFO(後進先出),因為棧遵循“後進先出”的原則;佇列被稱為 FIFO(先進先出),因為佇列遵循“先進先出”的原則。Python 的內建函式使程式碼更短更簡潔。
Queue 模組實現了多生產者、多消費者佇列,它在多執行緒程式設計中特別有用,此時需要在多個執行緒之間安全地交換資訊。此模組中的 Queue 類實現了所有必要的鎖定語義,並且它依賴於 Python 中執行緒支援的可用性。
此模組實現了三種類型的佇列,它們的區別僅在於檢索條目的順序。對於 FIFO 佇列,首先新增的任務是首先檢索的任務;對於 LIFO 佇列,最近新增的條目是首先檢索的條目(類似於棧的操作)。對於優先順序佇列,條目保持排序(使用 heapq 模組),並且首先檢索值最低的條目。
此佇列模組定義了以下類和異常。
class Queue.Queue(maxsize=0)
這是 FIFO 佇列的建構函式。引數 maxsize 是一個整數,它設定可以放入佇列中的專案數量的上限。一旦達到此大小,插入將被阻塞,直到佇列專案被使用。如果 maxsize 小於或等於零,則佇列大小將是無限的。
class Queue.LifoQueue(maxsize=0)
這是 LIFO 佇列的建構函式。引數 maxsize 是一個整數,它設定可以放入佇列中的專案數量的上限。一旦達到此大小,插入將被阻塞,直到佇列專案被使用。如果 maxsize 小於或等於零,則佇列大小將是無限的。
class Queue.PriorityQueue(maxsize=0)
這是優先順序佇列的建構函式。引數 maxsize 是一個整數,它設定可以放入佇列中的專案數量的上限。一旦達到此大小,插入將被阻塞,直到佇列專案被使用。如果 maxsize 小於或等於零,則佇列大小是無限的。
exception Queue.Empty
當在空佇列物件上呼叫非阻塞 get()(或 get_nowait())時,此行表示引發的異常。
exception Queue.Full
此行表示當在已滿的佇列物件上呼叫非阻塞 put()(或 put_nowait())時引發的異常。
佇列物件
Queue.qsize()
此函式返回佇列的大致大小。
Queue.empty()
如果佇列為空,此函式返回 True,否則返回 False。如果 empty() 返回 True,它並不保證隨後對 put() 的呼叫不會阻塞。類似地,如果 empty() 返回 False,它並不保證隨後對 get() 的呼叫不會阻塞。
Queue.full()
如果佇列已滿,則返回 True,否則返回 False。如果 full() 返回 True,它並不保證隨後對 get() 的呼叫不會阻塞。類似地,如果 full() 返回 False,它並不保證隨後對 put() 的呼叫不會阻塞。
Queue.put(item[, block[, timeout]])
將專案放入佇列。如果可選引數 block 為 true 且 timeout 為 None(預設值),則在必要時阻塞,直到有空閒槽可用。如果 timeout 是一個正數,它最多阻塞 timeout 秒,如果在此時間內沒有空閒槽可用,則引發 Full 異常。否則(block 為 false),如果立即有空閒槽可用,則將專案放入佇列,否則引發 Full 異常(在這種情況下忽略 timeout)。
Queue.get([block[, timeout]])
從佇列中移除並返回一個專案。如果可選引數 block 為 true 且 timeout 為 None(預設值),則在必要時阻塞,直到有專案可用。如果 timeout 是一個正數,它最多阻塞 timeout 秒,如果在此時間內沒有專案可用,則引發 Empty 異常。否則(block 為 false),如果立即有專案可用,則返回一個專案,否則引發 Empty 異常(在這種情況下忽略 timeout)。
Queue.task_done()
指示先前排隊的任務已完成。由佇列使用者執行緒使用。對於每個用於獲取任務的 get(),後續對 task_done() 的呼叫告訴佇列任務的處理已完成。
如果 join() 目前正在阻塞,則當所有專案都已處理完畢後(這意味著為放入佇列中的每個專案都收到了 task_done() 呼叫),它將恢復。
如果呼叫的次數超過放入佇列中的專案數量,則引發 ValueError。
Queue.join()
阻塞,直到佇列中的所有專案都已獲取並處理完畢。
每當專案新增到佇列時,未完成任務的數量就會增加。每當使用者執行緒呼叫 task_done() 以指示已檢索到專案並且其所有工作都已完成時,計數就會減少。當未完成任務的數量降為零時,join() 將取消阻塞。
示例程式碼
import queue #maximum capacity of queue is 20 Q = queue.Queue(maxsize=40) Q.put(50) Q.put(90) Q.put(10) Q.put(70) print(Q.get()) print(Q.get()) print(Q.get()) print(Q.get())
輸出
50 90 10 70
下溢/上溢示例
import queue
Q = queue.Queue(maxsize=30)
print(Q.qsize())
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print("Full: ", Q.full())
Q.put(90)
Q.put(100)
print("Full: ", Q.full())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print("Full: ", Q.full())
輸出
0 Full: False Full: False 50 90 10 Empty: False 70 90 100 Empty: True Full: False
棧的示例 3
import queue
S = queue.LifoQueue(maxsize=10)
# qsize() give the maxsize of
# the Queue
print(S.qsize())
S.put(50)
S.put(90)
S.put(10)
S.put(70)
S.put(90)
S.put(10)
print("Full: ", S.full())
print("Size: ", S.qsize())
# Data will be accessed in the
# reverse order Reverse of that
# of Queue
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print("Empty: ", S.empty())
輸出
0 Full: False Size: 6 10 90 70 10 90 Empty: False
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP