今天講一下佇列,用到一個python自帶的庫,queue
佇列的三種實現方法有:
1、FIFO先入先出佇列(Queue)
2、LIFO後入先出佇列(LifoQueue)
3、優先順序佇列(PriorityQueue)
先講一下Queue中的幾個方法
# 三種 FIFO LIFO Priority # 建立先入先出的佇列 # q = queue.Queue() # q.qsize() # 返回當前佇列包含的訊息數量 # q.empty() # 如果佇列為空返回True 反之False # q.full() # 如果佇列滿了,返回True 反之False # q.get() # 獲取佇列,timeout等待時間 get(self, block=True,timeout=None) block表示是否等待 timeout表示等待多久 # q.put(item) # 寫入佇列 put(self, item, block=True,timeout=None) block表示是否等待 timeout表示等待多久 # q.get_nowait() # 相當於q.get(False) 獲取不等待 # q.put_nowait() # 相當於 q.put(item,False) 寫入不等待 # q.task_done() # 在完成一項工作之後,使用這個方法可以向佇列傳送一個訊號,表示該任務執行完畢 # q.join() # 等待佇列中所有任務(資料)執行完畢之後再往下執行,否則一直等待 # 注意點 :join是判斷的依據。不單單指的是佇列中沒有資料,資料get出去之後,要使用task_done向佇列傳送一個訊號,表示該任務執行完畢 # /資料使用完畢
在下面我們用程式碼來解釋
Queue:先入先出佇列
import queue
q1 = queue.Queue(3) # 定義3 指定佇列長度 表示只能塞3條資料 不寫可以無限塞 q1.put(1) # 等待插入 q1.put(11) q1.put(33) # q1.put(33,block=False) # 不等待插入 滿了之後報錯 # q1.put_nowait(33) # 不等待插入 滿了之後報錯 print(q1.get()) print(q1.get()) # 先入先出獲取 1先出 33最後出 print(q1.get()) # print(q1.get(block=False)) # 不等待獲取 佇列為空報錯 # print(q1.get_nowait()) # 不等待獲取 佇列為空報錯 # q1.put(3) print(q1.qsize()) # 獲取佇列中的任務數/訊息數 print(q1.full()) # 判斷佇列是否已滿 print(q1.empty()) # 判斷佇列是否為空 q1.task_done() q1.task_done() q1.task_done() # 插入一條資料使用完成之後就要傳送一條訊息 q1.join() # 收到task_done返回的訊號,當都使用完成之後才會繼續往下執行 如果任務沒有完成那將不會向下執行 print('join之後')
LifoQueue:後入先出佇列
import queue
q = queue.LifoQueue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get()) # 後進先出 其他方法與FIFO相同
PriorityQueue:優先順序佇列
import queue q = queue.PriorityQueue(3) # 其他方法與 FIFO 相同 q.put((1, '哈哈1')) # 接受元組為引數 第一個是優先順序數字型的 第二個是資料 q.put((88, '哈哈88')) q.put((3, '哈哈3')) print(q.get()) print(q.get()) print(q.get()) # 根據前面的優先順序出,優先順序數字小的先出
利用佇列可以解決多執行緒對共享全域性變數的一個處理