1. Python 的佇列(Queue)是什麼?
佇列的基本概念
佇列(Queue)是一種資料結構,採用「FIFO(先進先出,First In, First Out)」的方式運作。也就是說,最先加入的元素會最先被取出。這種機制在計算機科學與程式設計的許多場景中廣泛應用,是高效處理資料的重要工具。
舉例來說,以下場景經常使用佇列:
- 任務排程(Task Scheduling): 依照先後順序執行已排定的任務。
- 緩衝(Buffering): 在串流數據處理中,將數據存入佇列並依序處理。
- 多執行緒間的通訊: 當多個執行緒同時處理數據時,可以使用佇列來管理數據的順序。
Python 標準函式庫中的 queue
模組提供了一個強大的工具,可以輕鬆實現佇列操作。此模組內部具備鎖機制(Locking Mechanism),確保在多執行緒環境下安全地交換數據。
2. Python 佇列的應用場景
佇列的常見用途
在 Python 中,佇列有許多應用場景,尤其在以下情況下特別有用:
- 任務排程(Task Scheduling): 當需要依序處理多個任務時,佇列是一種理想的解決方案。例如,當網頁伺服器收到大量請求時,可以將這些請求依序加入佇列,然後按順序處理,以提高資源使用效率。
- 數據緩衝(Data Buffering): 在串流處理中,佇列可用於暫存數據,直到處理單元準備好接收。例如,在影片串流或即時數據處理中,佇列可確保數據穩定傳輸。
- 多執行緒間的數據共享: 佇列可以作為不同執行緒之間安全傳遞數據的工具。在多執行緒程式中,佇列用來將任務分配給不同的執行緒進行處理。

3. queue
模組概覽
類別介紹
Python 的 queue
模組提供了三種主要的佇列類別,每種都有不同的特性與用途。以下是它們的介紹與使用方式:
Queue
(FIFO 佇列)- 最基本的佇列類型,遵循先進先出(FIFO, First In, First Out)的原則,最先加入的項目會最先被取出。
- 使用範例:
import queue q = queue.Queue() q.put("task1") q.put("task2") print(q.get()) ## 輸出 "task1"
LifoQueue
(LIFO 佇列)- 類似堆疊(Stack),遵循後進先出(LIFO, Last In, First Out)的原則,最後加入的項目會最先被取出。
- 使用範例:
import queue q = queue.LifoQueue() q.put("task1") q.put("task2") print(q.get()) ## 輸出 "task2"
PriorityQueue
(優先佇列)- 根據優先順序取出項目,數值較小的項目優先處理。
- 使用範例:
import queue q = queue.PriorityQueue() q.put((1, "task1")) q.put((3, "task3")) q.put((2, "task2")) print(q.get()) ## 輸出 "(1, 'task1')"
這些類別可根據不同的需求靈活選擇,以便高效管理數據。
4. FIFO 佇列的實作方法
基本用法
FIFO 佇列是最常見的佇列類型,在 Python 中可以透過 queue.Queue
來實作。以下是一個基本範例:
import queue
## 建立 FIFO 佇列
q = queue.Queue()
## 將元素加入佇列
q.put("apple")
q.put("banana")
q.put("cherry")
## 從佇列取出元素
while not q.empty():
print(q.get())
這段程式碼會依照 "apple"
, "banana"
, "cherry"
的順序取出元素,並依序輸出。透過 empty()
方法,可確保佇列不會取出不存在的元素。
實際應用範例
例如,在網頁伺服器處理請求時,可以將接收到的請求加入佇列,並按照 FIFO 原則依序處理。這樣可以確保請求不會遺失,並提升處理效率。

5. 進階佇列操作
佇列的方法(Methods)
Python 的 queue
模組提供了許多方便的方法,讓開發者可以更有效地操作佇列。以下介紹幾個常用的方法:
qsize()
- 回傳佇列內目前的元素數量。
- 使用範例:
q = queue.Queue() q.put("task1") print(q.qsize()) ## 輸出 1
empty()
- 檢查佇列是否為空,回傳
True
或False
。 - 使用範例:
q = queue.Queue() print(q.empty()) ## 輸出 True
- 檢查佇列是否為空,回傳
full()
- 檢查佇列是否已滿(需設定
maxsize
)。 - 使用範例:
q = queue.Queue(maxsize=2) q.put("task1") q.put("task2") print(q.full()) ## 輸出 True
- 檢查佇列是否已滿(需設定
put(item)
- 將項目加入佇列。預設為
block=True
,當佇列已滿時,會等待直到有空位可用。 - 使用範例:
q = queue.Queue() q.put("task1")
- 將項目加入佇列。預設為
get()
- 從佇列取出項目。如果佇列為空且
block=True
,則會等待直到有項目可用。 - 使用範例:
q = queue.Queue() q.put("task1") task = q.get() print(task) ## 輸出 "task1"
- 從佇列取出項目。如果佇列為空且
透過這些方法,可以更靈活地管理佇列,確保數據處理的穩定性與效率。
6. 佇列中的例外處理
佇列的例外處理機制
在 queue
模組中,當執行 get()
或 put()
操作時,可能會遇到例外狀況。Python 提供了專門的例外類別來處理這些情況,以確保程式不會因錯誤而中斷。
queue.Full
- 當佇列已滿且執行
put()
操作時,若未使用block=False
,則會發生此例外。 - 例外處理範例:
try: q.put("task", block=False) except queue.Full: print("佇列已滿")
- 當佇列已滿且執行
queue.Empty
- 當佇列為空且執行
get()
操作時,若未使用block=False
,則會發生此例外。 - 例外處理範例:
try: task = q.get(block=False) except queue.Empty: print("佇列為空")
- 當佇列為空且執行
這些例外處理機制對於多執行緒環境尤為重要,因為它們能夠確保程式不會因為非預期的佇列狀態而發生錯誤,進而提升系統的穩定性。

7. 在 Python 的多執行緒環境中使用佇列
多執行緒中的任務管理
Python 的 queue
模組在多執行緒環境中特別有用。透過佇列,我們可以安全地在不同執行緒之間共享數據,並有效分配任務。以下是一個簡單的範例:
import queue
import threading
## 建立佇列
q = queue.Queue()
## 定義工作執行緒
def worker():
while True:
item = q.get()
print(f"處理中: {item}")
q.task_done()
## 啟動執行緒
threading.Thread(target=worker, daemon=True).start()
## 將任務加入佇列
for item in range(5):
q.put(item)
## 等待所有任務完成
q.join()
print("所有任務已完成")
這段程式碼建立了一個工作執行緒,負責從佇列中取出任務並執行。q.join()
確保所有任務執行完畢後才會結束程式。使用佇列能有效避免多執行緒競爭數據,確保並行處理的穩定性。
8. 使用有限佇列(Bounded Queue)
什麼是有限佇列?
有限佇列(Bounded Queue)是一種設定了最大容量的佇列。這種類型的佇列可以幫助控制資源使用,防止系統因過多請求而過載。例如,在 Web 伺服器處理大量請求時,可以透過有限佇列來避免超過可用資源。
有限佇列的主要特點包括:
- 當佇列滿時的行為
當佇列已滿時,新加入的項目可能會受到以下兩種處理方式之一:
- 拒絕新項目:當佇列達到最大容量時,不允許新增項目。
- 覆蓋舊項目:移除最早加入的項目,以便加入新的項目。
- 資源管理
有限佇列可以幫助更有效地管理記憶體與 CPU,確保系統穩定運行。
使用範例
以下是使用 Python 實作有限佇列的範例:
import queue
## 建立有限佇列(最大容量為 3)
q = queue.Queue(maxsize=3)
## 將項目加入佇列
q.put("task1")
q.put("task2")
q.put("task3")
## 嘗試加入第四個項目,將會觸發例外
try:
q.put_nowait("task4")
except queue.Full:
print("佇列已滿")
在此範例中,佇列的最大容量為 3,當嘗試加入第四個項目時,會觸發 queue.Full
例外。這種機制可確保系統不會因為無限制的數據累積而崩潰。

9. 結論
Python 的 queue
模組是一個強大且靈活的工具,能夠幫助開發者高效管理數據,並在並行處理、多執行緒應用場景中發揮關鍵作用。透過 FIFO 佇列、LIFO 佇列與優先佇列,我們可以根據不同需求選擇適合的數據結構。
此外,透過例外處理機制與有限佇列,我們可以增強系統的穩定性,避免資源過載或數據競爭問題。在進行複雜的數據處理時,建議善用這些功能,以提升程式的可靠性與效能。