Python佇列的三種佇列實現方法

白加黑呀發表於2020-04-19

今天講一下佇列,用到一個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())  # 根據前面的優先順序出,優先順序數字小的先出

利用佇列可以解決多執行緒對共享全域性變數的一個處理

相關文章