網站首頁 編程語言 正文
一、什么是隊列?
像排隊一樣,從頭到尾排成一排,還可以有人繼續往后排隊,這就是隊列。
這里學委想說的是Queue
這個類, 它是queue
這個內置模塊內的一個類。
import queue q = queue.Queue(5) #可以傳入參數指定隊列大小 queue.Queue()# 不傳或者給0或者<0的數字則創建一個無限長度的隊列
它提供了很多函數,下面幾個函數,我們使用的比較多:
-
get
: 獲取并移除隊頭元素,就是出隊 -
put
: 往隊列末尾加入元素,也就是后來者排隊 -
qsize
: 獲取隊列的長度 -
empty
: 隊列空了,沒有人在排了 -
full
: 隊列滿了。
看著比較枯燥,學委畫了下圖展示:
這個隊列put了3次,依次放入:持續學習,持續開發,我雷學委。隊列長度為3
二、隊列基操 入隊/出隊/查隊列狀態
準備了下面的代碼:
import queue q = queue.Queue(5) print("學委粉絲隊列:", q) print("空隊,學委粉絲隊列大小:", q.qsize()) print("空隊列?", q.empty()) for i in range(5): ? ? q.put(i) print("隊列滿了?", q.full()) print("排滿了,學委粉絲隊列大小:", q.qsize()) while not q.empty(): ? ? print("粉絲 %s 出隊點贊!" % q.get()) print("最后,學委粉絲隊列大小:", q.qsize())
這段代碼創建了一個長的為5的隊列。
然后一個循環寫滿隊列,接著再依此出隊,粉絲出隊點贊。
下面是運行效果:
是不是很簡單。
三、Queue是一個線程安全的類
前面幾篇文章,碰到下面的代碼(反復讀寫共享變量)結果總是出乎依賴!
amount = 100 def transfer(money): ? ? global amount ? ? for i in range(100000): ? ? ? ? amount += money
如果我們對隊列進行反復讀寫,會不會出現問題呢?
不妨,寫個代碼驗收一下:
import queue import threading xuewei_fans_q = queue.Queue() def transfer(money): ? ? for i in range(100000): ? ? ? ? xuewei_fans_q.put(money) ? ? ? ? xuewei_fans_q.get() # 創建4個任務重復給學委加關注/脫粉(還是希望各位編程的明日之星跟著學習,共同進步!) t_group = [] for i in range(10): ? ? t = threading.Thread(target=lambda: transfer(-1)) ? ? t_group.append(t) ? ? t.start() ? ? t = threading.Thread(target=lambda: transfer(1)) ? ? t_group.append(t) ? ? t.start() ? ? t = threading.Thread(target=lambda: transfer(-1)) ? ? t_group.append(t) ? ? t.start() ? ? t = threading.Thread(target=lambda: transfer(1)) ? ? t_group.append(t) ? ? t.start() for t in t_group: ? ? t.join() print("-" * 16) print("活躍線程數:", threading.active_count()) print("活躍線程:", threading.current_thread().name) #反復對隊列進行添加數據,移除數據,隊列最后清零了 print("學委粉絲隊列:", xuewei_fans_q.qsize())
不管運行多少次,隊列(希望是黑粉隊列)都為0元素。
總結:
本篇學委分享了一個線程安全的隊列Queue,這個非常重要!但是隊列Queue這個類是線程安全的,這個是經過驗證的
原文鏈接:https://levin.blog.csdn.net/article/details/122033108
相關推薦
- 2022-12-26 Golang判斷struct/slice/map是否相等以及對比的方法總結_Golang
- 2021-12-14 如何利用C語言輸出3D立體感心形圖詳解_C 語言
- 2022-10-21 C++調用matlab函數的實例_C 語言
- 2022-08-17 C++詳解鏈棧的實現_C 語言
- 2023-10-09 如何搭建小程序項目,uniApp搭建,uView組件庫的引入和請求配置
- 2022-03-25 centos系統安裝Kubernetes集群步驟_Linux
- 2022-02-28 [rejected] master -> master (fetch first) error: f
- 2022-04-21 C語言中的柔性數組你真的了解嗎_C 語言
- 最近更新
-
- 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同步修改后的遠程分支