python隊列Queue的詳解
Queue
Queue是python標(biāo)準(zhǔn)庫中的線程安全的隊列(FIFO)實現(xiàn),提供了一個適用于多線程編程的先進先出的數(shù)據(jù)結(jié)構(gòu),即隊列,用來在生產(chǎn)者和消費者線程之間的信息傳遞
基本FIFO隊列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數(shù),指明了隊列中能存放的數(shù)據(jù)個數(shù)的上限。一旦達到上限,插入會導(dǎo)致阻塞,直到隊列中的數(shù)據(jù)被消費掉。如果maxsize小于或者等于0,隊列大小沒有限制。
舉個栗子:
import Queue q = Queue.Queue() for i in range(5): q.put(i) while not q.empty(): print q.get()
輸出:
0
1
2
3
4
LIFO隊列
class Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后進先出。與棧的類似,使用也很簡單,maxsize用法同上
再舉個栗子:
import Queue q = Queue.LifoQueue() for i in range(5): q.put(i) while not q.empty(): print q.get()
輸出:
4
3
2
1
0
可以看到僅僅是將Queue.Quenu類替換為Queue.LifiQueue類
優(yōu)先級隊列
class Queue.PriorityQueue(maxsize=0)
構(gòu)造一個優(yōu)先隊列。maxsize用法同上。
import Queue import threading class Job(object): def __init__(self, priority, description): self.priority = priority self.description = description print 'Job:',description return def __cmp__(self, other): return cmp(self.priority, other.priority) q = Queue.PriorityQueue() q.put(Job(3, 'level 3 job')) q.put(Job(10, 'level 10 job')) q.put(Job(1, 'level 1 job')) def process_job(q): while True: next_job = q.get() print 'for:', next_job.description q.task_done() workers = [threading.Thread(target=process_job, args=(q,)), threading.Thread(target=process_job, args=(q,)) ] for w in workers: w.setDaemon(True) w.start() q.join()
結(jié)果
Job: level 3 job
Job: level 10 job
Job: level 1 job
for: level 1 job
for: level 3 job
for: job: level 10 job
一些常用方法
task_done()
意味著之前入隊的一個任務(wù)已經(jīng)完成。由隊列的消費者線程調(diào)用。每一個get()調(diào)用得到一個任務(wù),接下來的task_done()調(diào)用告訴隊列該任務(wù)已經(jīng)處理完畢。
如果當(dāng)前一個join()正在阻塞,它將在隊列中的所有任務(wù)都處理完時恢復(fù)執(zhí)行(即每一個由put()調(diào)用入隊的任務(wù)都有一個對應(yīng)的task_done()調(diào)用)。
join()
阻塞調(diào)用線程,直到隊列中的所有任務(wù)被處理掉。
只要有數(shù)據(jù)被加入隊列,未完成的任務(wù)數(shù)就會增加。當(dāng)消費者線程調(diào)用task_done()(意味著有消費者取得任務(wù)并完成任務(wù)),未完成的任務(wù)數(shù)就會減少。當(dāng)未完成的任務(wù)數(shù)降到0,join()解除阻塞。
put(item[, block[, timeout]])
將item放入隊列中。
- 如果可選的參數(shù)block為True且timeout為空對象(默認的情況,阻塞調(diào)用,無超時)。
- 如果timeout是個正整數(shù),阻塞調(diào)用進程最多timeout秒,如果一直無空空間可用,拋出Full異常(帶超時的阻塞調(diào)用)。
- 如果block為False,如果有空閑空間可用將數(shù)據(jù)放入隊列,否則立即拋出Full異常
- 其非阻塞版本為put_nowait等同于put(item, False)
get([block[, timeout]])
從隊列中移除并返回一個數(shù)據(jù)。block跟timeout參數(shù)同put方法
其非阻塞方法為`get_nowait()`相當(dāng)與get(False)
empty()
如果隊列為空,返回True,反之返回False
以上所述是小編給大家介紹的python隊列Queue詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Python機器學(xué)習(xí)利用鳶尾花數(shù)據(jù)繪制ROC和AUC曲線
這篇文章主要為大家介紹了Python機器學(xué)習(xí)利用鳶尾花數(shù)據(jù)繪制ROC和AUC曲線實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02pycharm遠程連接服務(wù)器并配置python interpreter的方法
這篇文章主要介紹了pycharm遠程連接服務(wù)器并配置python interpreter的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Python中的命令行參數(shù)解析工具之docopt詳解
docopt 是一個用來解析命令行參數(shù)的工具,當(dāng)想要在 Python 程序后面附加參數(shù)時,就不需要再為此而發(fā)愁了。下面這篇文章主要介紹了Python中命令行參數(shù)解析工具之docopt的相關(guān)資料,介紹的非常詳細,需要的朋友們下面來一起看看吧。2017-03-03Python圖像處理庫PIL的ImageDraw模塊介紹詳解
這篇文章主要介紹了Python圖像處理庫PIL的ImageDraw模塊介紹詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Python爬取智聯(lián)招聘數(shù)據(jù)分析師崗位相關(guān)信息的方法
這篇文章主要介紹了Python爬取智聯(lián)招聘數(shù)據(jù)分析師崗位相關(guān)信息的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python中的數(shù)據(jù)標(biāo)準(zhǔn)化與反標(biāo)準(zhǔn)化全面指南
在數(shù)據(jù)處理和機器學(xué)習(xí)中,數(shù)據(jù)標(biāo)準(zhǔn)化是一項至關(guān)重要的預(yù)處理步驟,標(biāo)準(zhǔn)化能夠?qū)⒉煌叨群头秶臄?shù)據(jù)轉(zhuǎn)換為相同的標(biāo)準(zhǔn),有助于提高模型的性能和穩(wěn)定性,Python提供了多種庫和函數(shù)來執(zhí)行數(shù)據(jù)標(biāo)準(zhǔn)化和反標(biāo)準(zhǔn)化,如Scikit-learn和TensorFlow2024-01-01