python中的queue隊列類型及函數(shù)用法
python queue隊列類型及函數(shù)
1.隊列的種類
Python queue模塊的FIFO隊列先進(jìn)先出。 class queue.Queue(maxsize)
LIFO類似于堆,即先進(jìn)后出。 class queue.LifoQueue(maxsize)
還有一種是優(yōu)先級隊列級別越低越先出來。 class queue.PriorityQueue(maxsize)
import queue # 先進(jìn)先出隊列 queue_obj = queue.Queue() for i in range(3): ? ? queue_obj.put(i) for i in range(3): ? ? print(queue_obj.get()) """執(zhí)行結(jié)果 0 1 2 """ # 先進(jìn)后出隊列,類似于堆棧 queue_obj = queue.LifoQueue() for i in range(3): ? ? queue_obj.put(i) for i in range(3): ? ? print(queue_obj.get()) """執(zhí)行結(jié)果 2 1 0 """ # 優(yōu)先級隊列 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()
2.隊列函數(shù)
maxsize = 10 queue_obj = queue.Queue(maxsize) # maxsize 代表隊列的上限, 如果隊列已滿, 則插入時需要等待, maxsize為零或負(fù)數(shù)時.隊列沒有限制 queue_obj.get(block=True, timeout=None) # block為True時,表示等待獲取,直至timeout超時 queue_obj.get_nowait() # 當(dāng)獲取不到元素時,報錯 queue_obj.put(item="待插入的元素", block=True, timeout=None) # block為True時,表示等待插入,直至timeout超時 queue_obj.put_nowait('待插入的元素') # 當(dāng)不能插入元素時報錯 queue_obj.empty() # 隊列為空時,返回True queue_obj.full() # 如果隊列滿時,返回True queue_obj.task_done() # 在每次獲取隊列中的元素, 操作完成之后, 調(diào)用該函數(shù)告訴隊列我已經(jīng)使用完成, 主要是給join函數(shù)使用 queue_obj.join() # 等待隊列內(nèi)的元素全部被獲取后, 再接觸阻塞(直至所有的任務(wù)全部task_done) """下面的例子驗證toask_done和join的關(guān)系""" for i in range(3): queue_obj.put(i) # 這里像隊列中添加三個元素 queue_obj.get() # 這里獲取隊列中的消息 queue_obj.task_done() queue_obj.get() # 這里獲取隊列中的消息 queue_obj.task_done() queue_obj.get() # 這里獲取隊列中的消息 queue_obj.task_done() queue_obj.join() print('直至隊列中的所有元素全部都被取出, join函數(shù)才不會阻塞, 如果只執(zhí)行了兩次task_done函數(shù), 則join會一直阻塞')
python 隊列類及其方法
1.Python的隊列類型
from queue import Queue, LifiQueue, PriorityQueue, SimpleQueue
FIFO
(先入先出)Queue(maxsize=0)
:FIFO隊列的構(gòu)造函數(shù)。maxsize是一個整數(shù),用于設(shè)置放入隊列中數(shù)據(jù)的上限。一旦達(dá)到此大小,插入將被阻塞。如果maxsize<=0,則隊列大小為無限。LIFO
(后進(jìn)先出)LifoQueue(maxsize=0)
:LIFO隊列的構(gòu)造函數(shù),其它同上。- 優(yōu)先級隊列
PriorityQueue(maxsize=0)
:優(yōu)先級隊列的構(gòu)造函數(shù),其它同上。 SimpleQueue
:FIFO隊列的簡單形式,缺少諸如任務(wù)跟蹤之類的高級功能。Empty
:在空對象上調(diào)用get()方法,引發(fā)的異常隊列。Full
:在已滿的對象上調(diào)用put()方法,引發(fā)的異常隊列。
2.隊列對象(適用Queue、LifoQueue和PriorityQueue)
qsize()
- 返回隊列的大小。
- 注意qsize()>0不能保證后續(xù)的get()不會阻塞,qsize()<maxsize也不能保證對get()的后續(xù)調(diào)用不會阻塞。
empty()
- 如果隊列是空的返回True,否則返回False。
- 如果返回True不能保證后續(xù)對put()的調(diào)用都不會阻塞。如果返回False也不能保證對get()的后續(xù)調(diào)用不會阻塞。
full()
- 如果隊列滿了返回True,否則返回False。
- 如果返回True不能保證對get()的后續(xù)調(diào)用不會阻塞。如果full返回False也不能保證后續(xù)對put()的調(diào)用不會阻塞。
put(item, block=True, timeout=None)
- 將數(shù)據(jù)插入隊列中。
- 如果block=True, timeout=None則在必要時進(jìn)行阻塞,直到隊列有空間為止。如果timeout=正數(shù),則它最多超時正數(shù)秒。Full隊列如果在該時間內(nèi)沒有空間可用,會引發(fā)異常。如果block=False,隊列有空間,則將數(shù)據(jù)放入隊列(超時被忽略),否則引發(fā)Full異常。
put_nowait(item)
- 等同于put(item, False)。
get(block=True, timeout=None)
- 從隊列中刪除并返回一個數(shù)據(jù)。
- 如果block=True, timeout=None則在必要時進(jìn)行阻塞,直到隊列有數(shù)據(jù)為止。如果timeout=正數(shù),則它最多超時正數(shù)秒。Empty隊列如果在該時間內(nèi)沒有數(shù)據(jù)可用,會引發(fā)異常。如果block=False,隊列有數(shù)據(jù),則會返回一個數(shù)據(jù)(超時被忽略),否則引發(fā)Empty異常。
get_nowait()
- 等同于get(False)。
task_done()
- 表示先前排隊的任務(wù)已完成。
join()
- 阻塞直到隊列中的所有數(shù)據(jù)都已獲得處理。每當(dāng)將項目添加到隊列時,未完成任務(wù)的數(shù)量就會增加。每當(dāng)使用者線程調(diào)用task_done()以指示已檢索到該項目并且該項目的所有工作完成時,該計數(shù)就會減少。當(dāng)未完成的任務(wù)數(shù)降至零時,join()取消阻止。
3.SimpleQueue對象
qsize() empty() put(item, block = True, timeout = None ) put_nowait(item) get(block = True,timeout = None) get_nowait(item)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python機(jī)器學(xué)習(xí)三大件之一numpy
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)三大件之一numpy,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助喲.需要的朋友可以參考下2021-05-05Python中schedule模塊定時任務(wù)的使用方法(2)
這篇文章主要介紹了Python中schedule模塊定時任務(wù)的使用方法,文章基于上一篇文章的內(nèi)容展開的后續(xù),需要的朋友可以參考一下2022-05-05Python流行ORM框架sqlalchemy安裝與使用教程
這篇文章主要介紹了Python流行ORM框架sqlalchemy安裝與使用,結(jié)合具體實例形式分析了sqlalchemy的安裝及ORM映射、查詢等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06200個Python?標(biāo)準(zhǔn)庫總結(jié)
這篇文章主要給大家分享了200個Python?標(biāo)準(zhǔn)庫總結(jié),主要對文本、數(shù)據(jù)類型、數(shù)學(xué)等多個類型總結(jié),既有一定的參考價值,需要的小伙伴可以參考一下2022-01-01PyQt5的安裝配置過程,將ui文件轉(zhuǎn)為py文件后顯示窗口的實例
今天小編就為大家分享一篇PyQt5的安裝配置過程,將ui文件轉(zhuǎn)為py文件后顯示窗口的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06