目錄
- 一.Python 執行緒佇列分類
- 二.Python 執行緒先進先出佇列 Queue 簡介
- 三.Python 執行緒先進先出佇列 Queue 常用函式
- 四.Python 執行緒先進先出佇列 Queue 使用
- 五.猜你喜歡
零基礎 Python 學習路線推薦 : Python 學習目錄 >> Python 基礎入門
之前的文章中講解很多關于執行緒間通信的知識,比如:執行緒互斥鎖 lock,執行緒事件 event,執行緒條件變數 condition 等等,這些都是在開發中經常使用的內容,而今天繼續給大家講解一個更重要的知識點 — 執行緒佇列 queue ;
一.Python 執行緒佇列分類
- 1.執行緒佇列 Queue — FIFO(先進先出佇列)****,即哪個資料先存入,取資料的時候先取哪個資料,同生活中的排隊買東西
- 2.執行緒佇列 LifoQueue — LIFO(先進后出佇列)****,即哪個資料最后存入的,取資料的時候先取,同生活中手槍的彈夾,子彈最后放入的先打出
- 3.執行緒佇列 PriorityQueue — PriorityQueue(優先級佇列)****,即存入資料時候加入一個優先級,取資料的時候優先級最高的取出
今天只對第一種普通執行緒佇列 Queue(FIFO) 講解,后面的兩種留到下一篇文章在做詳細講解!
二.Python 執行緒先進先出佇列 Queue 簡介
執行緒佇列 Queue,也稱 FIFO,存在佇列中的資料先進先出,就好比拉肚子,吃什么拉什么~~呃呃,有點重口味,如下圖:

舉個形象的例子:如果把 123456 這 6 個數字,依次放入佇列 queue 中,那么我們重佇列中取資料的時候,取到的第一個資料必然是 1 ,第二個資料必然是 2 ,依次類推,這就是所謂的吃什么拉什么 — FIFO (先進先出);

三.Python 執行緒先進先出佇列 Queue 常用函式
- **Queue.qsize —**回傳佇列大小
- **Queue.empty —**判斷佇列是否為空
- **Queue.full —**判斷佇列是否滿了
- Queue.get([block[,timeout]]) —從佇列頭洗掉并回傳一個 item ,block 默認為 True ,表示當佇列為空卻去 get 的時候會阻塞執行緒,等待直到有有 item 出現為止來 get 出這個 item ,如果是 False 的話表明當佇列為空你卻去 get 的時候,會引發例外,在 block 為 True 的情況下可以再設定 timeout 引數,表示當佇列為空,get 阻塞 timeout 指定的秒數之后還沒有 get 到的話就引發 Full 例外,
- Queue.task_done —從場景上來說,處理完一個 get 出來的 item 之后,呼叫 task_done 將向佇列發出一個信號,表示本任務已經完成(與 Queue.get 配對使用),
- Queue.put(…[,block[,timeout]]) —向隊尾插入一個 item ,同樣若 block=True 的話佇列滿時就阻塞等待有空位出來再 put ,block=False 時引發例外,同 get 的 timeout,put 的 timeout 是在 block 為 True 的時候進行超時設定的引數,
- **Queue.join —**監視所有 item 并阻塞主執行緒,直到所有 item 都呼叫了 task_done 之后主執行緒才繼續向下執行,這么做的好處在于,假如一個執行緒開始處理最后一個任務,它從任務佇列中拿走最后一個任務,此時任務佇列就空了但最后那個執行緒還沒處理完,當呼叫了 join 之后,主執行緒就不會因為佇列空了而擅自結束,而是等待最后那個執行緒處理完成了,
四.Python 執行緒先進先出佇列 Queue 使用
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿說編程
@Blog(個人博客地址): www.codersrc.com
@File:Python 執行緒先進先出佇列Queue.py
@Time:2021/05/04 07:37
@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
"""
import threading
import queue
q = queue.Queue(5) # 長度,佇列中最多存放5個資料
def put():
for i in range(20):
q.put(i)
print("數字%d存入佇列成功" % i)
q.join() # 阻塞行程,直到所有任務完成,取多少次資料task_done多少次才行,否則最后的ok無法列印
print('ok')
def get():
for i in range(20):
value = https://www.cnblogs.com/shuopython/archive/2021/06/26/q.get()
print("數字%d重佇列中取出" % value)
q.task_done() # 必須每取走一個資料,發一個信號給join
# q.task_done() #放在這沒用,因為join實際上是一個計數器,put了多少個資料,
# 計數器就是多少,每task_done一次,計數器減1,直到為0才繼續執行
t1 = threading.Thread(target=put, args=())
t1.start()
t2 = threading.Thread(target=get, args=())
t2.start()
'''
輸出結果:
數字0存入佇列成功
數字1存入佇列成功
數字2存入佇列成功
數字3存入佇列成功
數字4存入佇列成功
數字0重佇列中取出
數字1重佇列中取出
數字2重佇列中取出
數字3重佇列中取出
數字4重佇列中取出
數字5存入佇列成功
數字6存入佇列成功
數字7存入佇列成功
數字8存入佇列成功
數字9存入佇列成功
數字5重佇列中取出
數字6重佇列中取出
數字7重佇列中取出
數字8重佇列中取出
數字9重佇列中取出
數字10存入佇列成功
數字11存入佇列成功
數字12存入佇列成功
數字13存入佇列成功
數字14存入佇列成功
數字10重佇列中取出
數字11重佇列中取出
數字12重佇列中取出
數字15存入佇列成功
數字16存入佇列成功
數字17存入佇列成功
數字13重佇列中取出
數字14重佇列中取出
數字15重佇列中取出
數字16重佇列中取出
數字18存入佇列成功
數字19存入佇列成功
數字17重佇列中取出
數字18重佇列中取出
數字19重佇列中取出
ok
'''
五.猜你喜歡
- Python 條件推導式
- Python 串列推導式
- Python 字典推導式
- Python 函式宣告和呼叫
- Python 不定長引數 *argc/**kargcs
- Python 匿名函式 lambda
- Python return 邏輯判斷運算式
- Python 字串/串列/元組/字典之間的相互轉換
- Python 區域變數和全域變數
- Python type 函式和 isinstance 函式區別
- Python is 和 == 區別
- Python 可變資料型別和不可變資料型別
- Python 淺拷貝和深拷貝
- Python 檔案讀寫操作
- Python 例外處理
- Python 模塊 import
- Python __name__ == ‘__main__’詳細解釋
- Python 執行緒創建和傳參
- Python 執行緒互斥鎖 Lock
- Python 執行緒時間 Event
- Python 執行緒條件變數 Condition
- Python 執行緒定時器 Timer
- Python 執行緒信號量 Semaphore
- Python 執行緒障礙物件 Barrier
- Python 執行緒佇列 Queue – FIFO
- Python 執行緒佇列 LifoQueue – LIFO
- Python 執行緒優先佇列 PriorityQueue
未經允許不得轉載:猿說編程 ? Python 執行緒佇列 Queue – FIFO
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288501.html
標籤:其他
