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


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

利用隊列可以解決多線程對共享全局變量的一個處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM