Python 线程队列 Queue – FIFO - Python零基础入门教程
目錄
- 一.Python 線程隊(duì)列分類
- 二.Python 線程先進(jìn)先出隊(duì)列 Queue 簡介
- 三.Python 線程先進(jìn)先出隊(duì)列 Queue 常用函數(shù)
- 四.Python 線程先進(jìn)先出隊(duì)列 Queue 使用
- 五.猜你喜歡
零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門
之前的文章中講解很多關(guān)于線程間通信的知識,比如:線程互斥鎖 lock,線程事件 event,線程條件變量 condition 等等,這些都是在開發(fā)中經(jīng)常使用的內(nèi)容,而今天繼續(xù)給大家講解一個更重要的知識點(diǎn) — 線程隊(duì)列 queue ;
一.Python 線程隊(duì)列分類
- 1.線程隊(duì)列 Queue — FIFO(先進(jìn)先出隊(duì)列)****,即哪個數(shù)據(jù)先存入,取數(shù)據(jù)的時候先取哪個數(shù)據(jù),同生活中的排隊(duì)買東西
- 2.線程隊(duì)列 LifoQueue — LIFO(先進(jìn)后出隊(duì)列)****,即哪個數(shù)據(jù)最后存入的,取數(shù)據(jù)的時候先取,同生活中手槍的彈夾,子彈最后放入的先打出
- 3.線程隊(duì)列 PriorityQueue — PriorityQueue(優(yōu)先級隊(duì)列)****,即存入數(shù)據(jù)時候加入一個優(yōu)先級,取數(shù)據(jù)的時候優(yōu)先級最高的取出
今天只對第一種普通線程隊(duì)列 Queue(FIFO) 講解,后面的兩種留到下一篇文章在做詳細(xì)講解!
二.Python 線程先進(jìn)先出隊(duì)列 Queue 簡介
線程隊(duì)列 Queue,也稱 FIFO,存在隊(duì)列中的數(shù)據(jù)先進(jìn)先出,就好比拉肚子,吃什么拉什么~~呃呃,有點(diǎn)重口味,如下圖:
舉個形象的例子:如果把 123456 這 6 個數(shù)字,依次放入隊(duì)列 queue 中,那么我們重隊(duì)列中取數(shù)據(jù)的時候,取到的第一個數(shù)據(jù)必然是 1 ,第二個數(shù)據(jù)必然是 2 ,依次類推,這就是所謂的吃什么拉什么 — FIFO (先進(jìn)先出);
三.Python 線程先進(jìn)先出隊(duì)列 Queue 常用函數(shù)
-
**Queue.qsize —**返回隊(duì)列大小
-
**Queue.empty —**判斷隊(duì)列是否為空
-
**Queue.full —**判斷隊(duì)列是否滿了
-
Queue.get([block[,timeout]]) —從隊(duì)列頭刪除并返回一個 item ,block 默認(rèn)為 True ,表示當(dāng)隊(duì)列為空卻去 get 的時候會阻塞線程,等待直到有有 item 出現(xiàn)為止來 get 出這個 item 。如果是 False 的話表明當(dāng)隊(duì)列為空你卻去 get 的時候,會引發(fā)異常。在 block 為 True 的情況下可以再設(shè)置 timeout 參數(shù)。表示當(dāng)隊(duì)列為空,get 阻塞 timeout 指定的秒數(shù)之后還沒有 get 到的話就引發(fā) Full 異常。
-
Queue.task_done —從場景上來說,處理完一個 get 出來的 item 之后,調(diào)用 task_done 將向隊(duì)列發(fā)出一個信號,表示本任務(wù)已經(jīng)完成(與 Queue.get 配對使用)。
-
Queue.put(…[,block[,timeout]]) —向隊(duì)尾插入一個 item ,同樣若 block=True 的話隊(duì)列滿時就阻塞等待有空位出來再 put ,block=False 時引發(fā)異常。同 get 的 timeout,put 的 timeout 是在 block 為 True 的時候進(jìn)行超時設(shè)置的參數(shù)。
-
**Queue.join —**監(jiān)視所有 item 并阻塞主線程,直到所有 item 都調(diào)用了 task_done 之后主線程才繼續(xù)向下執(zhí)行。這么做的好處在于,假如一個線程開始處理最后一個任務(wù),它從任務(wù)隊(duì)列中拿走最后一個任務(wù),此時任務(wù)隊(duì)列就空了但最后那個線程還沒處理完。當(dāng)調(diào)用了 join 之后,主線程就不會因?yàn)殛?duì)列空了而擅自結(jié)束,而是等待最后那個線程處理完成了。
四.Python 線程先進(jìn)先出隊(duì)列 Queue 使用
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:猿說編程 @Blog(個人博客地址): www.codersrc.com @File:Python 線程先進(jìn)先出隊(duì)列Queue.py @Time:2021/05/04 07:37 @Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累!"""import threading import queueq = queue.Queue(5) # 長度,隊(duì)列中最多存放5個數(shù)據(jù)def put():for i in range(20):q.put(i)print("數(shù)字%d存入隊(duì)列成功" % i)q.join() # 阻塞進(jìn)程,直到所有任務(wù)完成,取多少次數(shù)據(jù)task_done多少次才行,否則最后的ok無法打印print('ok')def get():for i in range(20):value = q.get()print("數(shù)字%d重隊(duì)列中取出" % value)q.task_done() # 必須每取走一個數(shù)據(jù),發(fā)一個信號給join# q.task_done() #放在這沒用,因?yàn)閖oin實(shí)際上是一個計(jì)數(shù)器,put了多少個數(shù)據(jù),# 計(jì)數(shù)器就是多少,每task_done一次,計(jì)數(shù)器減1,直到為0才繼續(xù)執(zhí)行t1 = threading.Thread(target=put, args=()) t1.start() t2 = threading.Thread(target=get, args=()) t2.start()''' 輸出結(jié)果:數(shù)字0存入隊(duì)列成功 數(shù)字1存入隊(duì)列成功 數(shù)字2存入隊(duì)列成功 數(shù)字3存入隊(duì)列成功 數(shù)字4存入隊(duì)列成功 數(shù)字0重隊(duì)列中取出 數(shù)字1重隊(duì)列中取出 數(shù)字2重隊(duì)列中取出 數(shù)字3重隊(duì)列中取出 數(shù)字4重隊(duì)列中取出 數(shù)字5存入隊(duì)列成功 數(shù)字6存入隊(duì)列成功 數(shù)字7存入隊(duì)列成功 數(shù)字8存入隊(duì)列成功 數(shù)字9存入隊(duì)列成功 數(shù)字5重隊(duì)列中取出 數(shù)字6重隊(duì)列中取出 數(shù)字7重隊(duì)列中取出 數(shù)字8重隊(duì)列中取出 數(shù)字9重隊(duì)列中取出 數(shù)字10存入隊(duì)列成功 數(shù)字11存入隊(duì)列成功 數(shù)字12存入隊(duì)列成功 數(shù)字13存入隊(duì)列成功 數(shù)字14存入隊(duì)列成功 數(shù)字10重隊(duì)列中取出 數(shù)字11重隊(duì)列中取出 數(shù)字12重隊(duì)列中取出 數(shù)字15存入隊(duì)列成功 數(shù)字16存入隊(duì)列成功 數(shù)字17存入隊(duì)列成功 數(shù)字13重隊(duì)列中取出 數(shù)字14重隊(duì)列中取出 數(shù)字15重隊(duì)列中取出 數(shù)字16重隊(duì)列中取出 數(shù)字18存入隊(duì)列成功 數(shù)字19存入隊(duì)列成功 數(shù)字17重隊(duì)列中取出 數(shù)字18重隊(duì)列中取出 數(shù)字19重隊(duì)列中取出 ok '''五.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python 線程隊(duì)列 Queue – FIFO
總結(jié)
以上是生活随笔為你收集整理的Python 线程队列 Queue – FIFO - Python零基础入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTF-汇编语言归纳
- 下一篇: Python 进程池 multiproc