Python中queue模塊常用函數(shù)使用方法
一、Queue模塊的知識(shí)點(diǎn)思維導(dǎo)圖
二、Queue模塊常用函數(shù)介紹
queue模塊是內(nèi)置的,不需要安裝直接導(dǎo)入就可以了。
(1)創(chuàng)建一個(gè)Queue對(duì)象
import queue # 創(chuàng)建一個(gè)隊(duì)列實(shí)例 q = queue.Queue(maxsize=20) # 可選參數(shù),默認(rèn)為無(wú)限大
(2)入隊(duì)
# 導(dǎo)入Python標(biāo)準(zhǔn)庫(kù)中的queue模塊,該模塊提供了線程安全的隊(duì)列數(shù)據(jù)結(jié)構(gòu) import queue # 創(chuàng)建一個(gè)Queue對(duì)象,可以理解為初始化一個(gè)隊(duì)列,參數(shù)maxsize默認(rèn)為0,表示隊(duì)列大小無(wú)限制 q = queue.Queue() # 使用for循環(huán)將數(shù)字0到9依次放入隊(duì)列中 # put方法用于將元素放入隊(duì)列尾部,即執(zhí)行入隊(duì)操作 for i in range(10): q.put(i) # 這里每執(zhí)行一次,就將i(0-9)作為一個(gè)元素放入隊(duì)列中 # 此時(shí),隊(duì)列q中按照先進(jìn)先出(FIFO)原則存儲(chǔ)了數(shù)字0-9
(3)出隊(duì)
# 導(dǎo)入Python內(nèi)置的queue模塊,其中包含線程安全的隊(duì)列數(shù)據(jù)結(jié)構(gòu) import queue # 創(chuàng)建一個(gè)Queue對(duì)象,即初始化一個(gè)空隊(duì)列 q = queue.Queue() # 使用for循環(huán)將0到9這10個(gè)整數(shù)依次入隊(duì) # put方法將元素添加到隊(duì)列的末尾 for i in range(10): q.put(i) # 每次循環(huán)都將i作為元素放入隊(duì)列中 # 此時(shí)q中已有元素,下面開始出隊(duì) # 出隊(duì)的三種方式 q.get() q.get_nowait() q.get(block=False) # 和get_nowait()一樣功能 # 循環(huán)出隊(duì) for i in range(q.qsize()): print(q.get())
(4)判空
# 導(dǎo)入Python內(nèi)置的queue模塊,其中包含線程安全的隊(duì)列數(shù)據(jù)結(jié)構(gòu) import queue # 創(chuàng)建一個(gè)Queue對(duì)象,即初始化一個(gè)空隊(duì)列 q = queue.Queue() # 使用for循環(huán)將0到9這10個(gè)整數(shù)依次入隊(duì) # put方法將元素添加到隊(duì)列的末尾 for i in range(10): q.put(i) # 每次循環(huán)都將i作為元素放入隊(duì)列中 # 使用while循環(huán)檢查隊(duì)列是否為空 # 當(dāng)隊(duì)列不為空時(shí),持續(xù)執(zhí)行循環(huán)體內(nèi)的操作 while not q.empty(): # 使用get方法從隊(duì)列中取出并移除一個(gè)元素 # 默認(rèn)情況下,get方法會(huì)阻塞直到有元素可用(除非設(shè)置了非阻塞模式) data = q.get() # 打印從隊(duì)列中取出的元素 print(data) # 當(dāng)隊(duì)列為空時(shí),while循環(huán)結(jié)束 # 此時(shí)所有之前入隊(duì)的整數(shù)0-9會(huì)被按照先進(jìn)先出(FIFO)的原則依次出隊(duì)并打印
(5)判滿
import queue # 初始化一個(gè)容量為5的隊(duì)列 q = queue.Queue(maxsize=5) # 入隊(duì)操作 for i in range(10): # 在入隊(duì)前檢查隊(duì)列是否已滿 if q.full(): print("Queue is full, cannot insert more items.") else: q.put(i) # 若隊(duì)列已滿,可以選擇等待一段時(shí)間后重試或其他處理策略 if q.full(): time.sleep(1) # 假設(shè)休眠一秒后重試 continue while not q.empty(): data = q.get() print(data)
(6)獲取隊(duì)列長(zhǎng)度
import queue # 創(chuàng)建一個(gè)隊(duì)列 q = queue.Queue() # 將10個(gè)元素放入隊(duì)列 for i in range(10): q.put(i) # 打印隊(duì)列長(zhǎng)度 print(f"Queue size before processing: {q.qsize()}") # 處理隊(duì)列中的元素,同時(shí)打印隊(duì)列長(zhǎng)度 while not q.empty(): data = q.get() print(f"Processing element: {data}, current queue size: {q.qsize()}") # 在處理過程中,每次從隊(duì)列中取出一個(gè)元素后,隊(duì)列長(zhǎng)度都會(huì)減一
(7)task_done() 和 unfinished_tasks
import queue import threading # 創(chuàng)建一個(gè)隊(duì)列 q = queue.Queue() # 生產(chǎn)者線程將任務(wù)放入隊(duì)列 def producer(): for i in range(10): q.put(i) print(f"Producer added task: {i}") # 消費(fèi)者線程從隊(duì)列中取出并處理任務(wù) def consumer(): while True: task = q.get() # 獲取任務(wù) print(f"Consumer started working on task: {task}") # 這里模擬任務(wù)處理過程 # 實(shí)際應(yīng)用中,此處應(yīng)替換為實(shí)際的任務(wù)處理邏輯 process_task(task) # 任務(wù)處理完畢,調(diào)用 task_done() q.task_done() print(f"Consumer finished task: {task}") # 檢查隊(duì)列是否為空且所有任務(wù)都已經(jīng)完成 if q.empty() and q.unfinished_tasks == 0: print("All tasks completed, exiting consumer.") break # 創(chuàng)建并啟動(dòng)生產(chǎn)者線程 p = threading.Thread(target=producer) p.start() p.join() # 確保生產(chǎn)者線程完成任務(wù) # 創(chuàng)建并啟動(dòng)消費(fèi)者線程 c = threading.Thread(target=consumer) c.start() c.join() # 等待消費(fèi)者線程處理完所有任務(wù)并退出 # 由于消費(fèi)者線程在所有任務(wù)完成后退出,所以在此處不需要再次檢查隊(duì)列狀態(tài)
(8)join
import queue import threading # 創(chuàng)建一個(gè)隊(duì)列 q = queue.Queue() # 生產(chǎn)者線程將任務(wù)放入隊(duì)列 def producer(): for i in range(10): q.put(i) print("Producer has added all tasks.") # 消費(fèi)者線程從隊(duì)列中取出并處理任務(wù) def consumer(): while True: task = q.get() # 獲取任務(wù) print(f"Consumer started working on task: {task}") # 這里模擬任務(wù)處理過程 # 實(shí)際應(yīng)用中,此處應(yīng)替換為實(shí)際的任務(wù)處理邏輯 process_task(task) # 任務(wù)處理完畢,調(diào)用 task_done() q.task_done() print(f"Consumer finished task: {task}") # 檢查隊(duì)列是否為空 if q.empty(): print("No more tasks in the queue.") break # 創(chuàng)建并啟動(dòng)生產(chǎn)者線程 p = threading.Thread(target=producer) p.start() p.join() # 確保生產(chǎn)者線程完成任務(wù)添加 # 創(chuàng)建并啟動(dòng)消費(fèi)者線程 c = threading.Thread(target=consumer) c.start() # 主線程等待所有任務(wù)完成 q.join() # 阻塞主線程,直到所有從隊(duì)列中取出的任務(wù)都被標(biāo)記為完成 print("All tasks have been processed and marked as done.")
總結(jié)
到此這篇關(guān)于Python中queue模塊常用函數(shù)使用的文章就介紹到這了,更多相關(guān)Python中queue模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python字典統(tǒng)計(jì)CSV數(shù)據(jù)的步驟和示例代碼
為了使用Python字典來(lái)統(tǒng)計(jì)CSV數(shù)據(jù),我們可以使用內(nèi)置的csv模塊來(lái)讀取CSV文件,并使用字典來(lái)存儲(chǔ)統(tǒng)計(jì)信息,以下是一個(gè)詳細(xì)的步驟和完整的代碼示例,需要的朋友可以參考下2024-12-12舉例講解Python設(shè)計(jì)模式編程的代理模式與抽象工廠模式
這篇文章主要介紹了Python編程的代理模式與抽象工廠模式,文中舉了兩個(gè)簡(jiǎn)單的小例子來(lái)說(shuō)明這兩種設(shè)計(jì)模式的思路在Python編程中的體現(xiàn),需要的朋友可以參考下2016-01-01Python中OpenCV?Tutorials?20??高動(dòng)態(tài)范圍成像的實(shí)現(xiàn)步驟
這篇文章主要介紹了OpenCV?Tutorials?20?-?高動(dòng)態(tài)范圍成像,本文還給大家展示了一種稱為曝光融合的替代方法,它可以產(chǎn)生低動(dòng)態(tài)范圍的圖像,需要的朋友可以參考下2022-06-06python-pymysql獲取字段名稱-獲取內(nèi)容方式
這篇文章主要介紹了python-pymysql獲取字段名稱-獲取內(nèi)容方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05使用Python實(shí)現(xiàn)快速搭建本地HTTP服務(wù)器
這篇文章主要介紹了如何使用Python快速搭建本地HTTP服務(wù)器,輕松實(shí)現(xiàn)一鍵 HTTP 文件共享,同時(shí)結(jié)合二維碼技術(shù),讓訪問更簡(jiǎn)單,感興趣的小伙伴可以了解下2025-04-04python函數(shù)裝飾器之帶參數(shù)的函數(shù)和帶參數(shù)的裝飾器用法示例
這篇文章主要介紹了python函數(shù)裝飾器之帶參數(shù)的函數(shù)和帶參數(shù)的裝飾器用法,結(jié)合實(shí)例形式分析了Python函數(shù)裝飾器中函數(shù)帶多個(gè)參數(shù)以及裝飾器帶有多個(gè)參數(shù)的具體原理與實(shí)現(xiàn)方法,需要的朋友可以參考下2019-11-11