您好,登錄后才能下訂單哦!
小編給大家分享一下Python中線程安全隊列Queue的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
像排隊一樣,從頭到尾排成一排,還可以有人繼續往后排隊,這就是隊列。
這里學委想說的是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的隊列。
然后一個循環寫滿隊列,接著再依此出隊,粉絲出隊點贊。
下面是運行效果:
是不是很簡單。
前面幾篇文章,碰到下面的代碼(反復讀寫共享變量)結果總是出乎依賴!
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元素。
看完了這篇文章,相信你對“Python中線程安全隊列Queue的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。