今天講一下隊列,用到一個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()) # 根據前面的優先級出,優先級數字小的先出
利用隊列可以解決多線程對共享全局變量的一個處理