正式的Python專欄第45篇,同學站住,別錯過這個從0開始的文章!
前面多篇文章詳細講解了執行緒和執行緒安全,以及一些程式多執行緒錯誤下的,執行緒安全改造,
是否有一種神器,解決執行緒/并發的問題呢?
有,它就是佇列(Queue)
什么是佇列?
像排隊一樣,從頭到尾排成一排,還可以有人繼續往后排隊,這就是佇列,
這里學委想說的是Queue這個類, 它是queue這個內置模塊內的一個類,
import queue
q = queue.Queue(5) #可以傳入引數指定佇列大小
queue.Queue()# 不傳或者給0或者<0的數字則創建一個無限長度的佇列
它提供了很多函式,下面幾個函式,我們使用的比較多:
- get: 獲取并移除隊頭元素,就是出隊
- put: 往佇列末尾加入元素,也就是后來者排隊
- qsize: 獲取佇列的長度
- empty: 佇列空了,沒有人在排了
- full: 佇列滿了,
看著比較枯燥,學委畫了下圖展示:

這個佇列put了3次,依次放入:持續學習,持續開發,我雷學委,佇列長度為3
佇列基操 入隊/出隊/查佇列狀態
學委準備了下面的代碼:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/24 12:02 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : threadsafe_queue0.py
# @Project : hello
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
如果我們對佇列進行反復讀寫,會不會出現問題呢?
不妨,寫個代碼驗收一下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/11/24 12:02 上午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : threadsafe_queue1.py
# @Project : hello
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這個類是執行緒安全的,這個是經過驗證的,讀者朋友務必掌握牢固,
雖然展示的佇列是粉絲佇列,學委還是希望各位編程的明日之星跟著學習,一起共同進步!
下一篇學委將分享用佇列改造轉賬程式,優雅的解決轉賬金額錯誤的問題,
對了,喜歡Python的朋友,請關注學委的 Python基礎專欄 or Python入門到精通大專欄
持續學習持續開發,我是雷學委!
編程很有趣,關鍵是把技術搞透徹講明白,
歡迎關注微信,點贊支持收藏!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387792.html
標籤:其他
上一篇:漏洞挖掘技巧-開源程式漏洞挖掘
下一篇:log4j反序列化漏洞詳解及利用
