首頁 > 軟體

Python執行緒之執行緒安全的佇列Queue

2022-02-24 13:00:47

一、什麼是佇列?

像排隊一樣,從頭到尾排成一排,還可以有人繼續往後排隊,這就是佇列。

這裡學委想說的是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這個類是執行緒安全的,這個是經過驗證的

到此這篇關於Python執行緒之執行緒安全的佇列的文章就介紹到這了,更多相關Python執行緒安全佇列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com