網站首頁 編程語言 正文
python queue隊列類型及函數
1.隊列的種類
Python queue模塊的FIFO隊列先進先出。 class queue.Queue(maxsize)
LIFO類似于堆,即先進后出。 class queue.LifoQueue(maxsize)
還有一種是優先級隊列級別越低越先出來。 class queue.PriorityQueue(maxsize)
import queue # 先進先出隊列 queue_obj = queue.Queue() for i in range(3): ? ? queue_obj.put(i) for i in range(3): ? ? print(queue_obj.get()) """執行結果 0 1 2 """ # 先進后出隊列,類似于堆棧 queue_obj = queue.LifoQueue() for i in range(3): ? ? queue_obj.put(i) for i in range(3): ? ? print(queue_obj.get()) """執行結果 2 1 0 """ # 優先級隊列 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.隊列函數
maxsize = 10 queue_obj = queue.Queue(maxsize) # maxsize 代表隊列的上限, 如果隊列已滿, 則插入時需要等待, maxsize為零或負數時.隊列沒有限制 queue_obj.get(block=True, timeout=None) # block為True時,表示等待獲取,直至timeout超時 queue_obj.get_nowait() # 當獲取不到元素時,報錯 queue_obj.put(item="待插入的元素", block=True, timeout=None) # block為True時,表示等待插入,直至timeout超時 queue_obj.put_nowait('待插入的元素') # 當不能插入元素時報錯 queue_obj.empty() # 隊列為空時,返回True queue_obj.full() # 如果隊列滿時,返回True queue_obj.task_done() # 在每次獲取隊列中的元素, 操作完成之后, 調用該函數告訴隊列我已經使用完成, 主要是給join函數使用 queue_obj.join() # 等待隊列內的元素全部被獲取后, 再接觸阻塞(直至所有的任務全部task_done) """下面的例子驗證toask_done和join的關系""" 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函數才不會阻塞, 如果只執行了兩次task_done函數, 則join會一直阻塞')
python 隊列類及其方法
1.Python的隊列類型
from queue import Queue, LifiQueue, PriorityQueue, SimpleQueue
-
FIFO
(先入先出)Queue(maxsize=0)
:FIFO隊列的構造函數。maxsize是一個整數,用于設置放入隊列中數據的上限。一旦達到此大小,插入將被阻塞。如果maxsize<=0,則隊列大小為無限。 -
LIFO
(后進先出)LifoQueue(maxsize=0)
:LIFO隊列的構造函數,其它同上。 - 優先級隊列
PriorityQueue(maxsize=0)
:優先級隊列的構造函數,其它同上。 -
SimpleQueue
:FIFO隊列的簡單形式,缺少諸如任務跟蹤之類的高級功能。 -
Empty
:在空對象上調用get()方法,引發的異常隊列。 -
Full
:在已滿的對象上調用put()方法,引發的異常隊列。
2.隊列對象(適用Queue、LifoQueue和PriorityQueue)
qsize()
- 返回隊列的大小。
- 注意qsize()>0不能保證后續的get()不會阻塞,qsize()<maxsize也不能保證對get()的后續調用不會阻塞。
empty()
- 如果隊列是空的返回True,否則返回False。
- 如果返回True不能保證后續對put()的調用都不會阻塞。如果返回False也不能保證對get()的后續調用不會阻塞。
full()
- 如果隊列滿了返回True,否則返回False。
- 如果返回True不能保證對get()的后續調用不會阻塞。如果full返回False也不能保證后續對put()的調用不會阻塞。
put(item, block=True, timeout=None)
- 將數據插入隊列中。
- 如果block=True, timeout=None則在必要時進行阻塞,直到隊列有空間為止。如果timeout=正數,則它最多超時正數秒。Full隊列如果在該時間內沒有空間可用,會引發異常。如果block=False,隊列有空間,則將數據放入隊列(超時被忽略),否則引發Full異常。
put_nowait(item)
- 等同于put(item, False)。
get(block=True, timeout=None)
- 從隊列中刪除并返回一個數據。
- 如果block=True, timeout=None則在必要時進行阻塞,直到隊列有數據為止。如果timeout=正數,則它最多超時正數秒。Empty隊列如果在該時間內沒有數據可用,會引發異常。如果block=False,隊列有數據,則會返回一個數據(超時被忽略),否則引發Empty異常。
get_nowait()
- 等同于get(False)。
task_done()
- 表示先前排隊的任務已完成。
join()
- 阻塞直到隊列中的所有數據都已獲得處理。每當將項目添加到隊列時,未完成任務的數量就會增加。每當使用者線程調用task_done()以指示已檢索到該項目并且該項目的所有工作完成時,該計數就會減少。當未完成的任務數降至零時,join()取消阻止。
3.SimpleQueue對象
qsize() empty() put(item, block = True, timeout = None ) put_nowait(item) get(block = True,timeout = None) get_nowait(item)
原文鏈接:https://blog.csdn.net/wcl1800/article/details/106478702
相關推薦
- 2023-02-18 Go語言IO輸入輸出底層原理及文件操作API_Golang
- 2022-04-12 git項目初次push提示error: failed to push some refs to ht
- 2022-06-19 Python?matplotlib實現條形統計圖_python
- 2022-05-15 Web?API中使用Autofac實現依賴注入_實用技巧
- 2022-09-18 Python中np.linalg.norm()用法實例總結_python
- 2022-07-27 C++詳細講解圖的拓撲排序_C 語言
- 2022-10-05 nginx配置指令之server_name的具體使用_nginx
- 2022-03-03 Failed to execute ‘drawImage‘ on ‘CanvasRenderingC
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支