首頁 > 軟體

python淺談一下執行緒間通訊之佇列

2023-11-02 22:00:25

為什麼需要執行緒間通訊

一個人的力量是有限的,但是團隊合作可以發揮更大的作用。而團隊共同作業需要交流和通訊來有效的分配任務和協調工作,來保證保時保量的完成工作。

為什麼執行緒間需要通訊呢?這就好比一個團隊需要完成一個工作,但是這個工作週期性比較長,複雜度也比較高,此時就需要團隊共同作業了,領導就把工作分為了n份,abc員工每次領取1份工作,做完了再向老闆同步,並且領取新的工作,這樣的話,工作很快就做完了嘛。

將執行緒代入上面的例子,在某些任務中,可能需要多個執行緒來完成同樣的任務,所以執行緒間通訊是為了執行緒之間的共同作業和同步,更快的完成任務。

執行緒間通訊方式有哪些

python多執行緒程式設計中,執行緒間通訊方法主要有以下幾種:

  • 共用變數

這是最常用,也是用的最多的方式,這個很好理解,在同一程序中,多個執行緒有一部分記憶體是共用程序的,所以多個執行緒可以使用“共用變數”的方式共用同一份資料,通過對該變數的讀寫操作來實現執行緒間通訊。

  • 佇列

python中,為我們提供了佇列的標準庫Queue,它是標準庫中的一個安全佇列的實現。作用是可以在多個執行緒間共用資料,主要用法為通過get方法將資料放入佇列,get方法將資料從佇列中取出來,

  • 管道

python管道是通過multiprocessing庫中的Pipe實現的,可以在2個執行緒之間任意傳遞資料,而且是雙向通訊的,主要用法為通過send方法傳送資料,通過recv方法接收資料。

除此之外,還有其他方法,例如 藉助第三方工具,比如redis等。

執行緒間通訊案例之佇列

共用變數,我們之前就已經用過了,比如上一節,我們自己實現了python的讀寫鎖,就用到了共用變數的方式。這裡就不再過多闡述了。這裡將介紹一下管道的案例:

佇列多用於生產者消費者,在python中,是使用queue模組下的Queue方法,建立一個新的佇列語句為:

queues = queue.Queue()

其中,Queue可以傳入一個maxsize,它將作為佇列的最大值,預設的話,是無限制。

想要往佇列中寫入資料的話,使用put方法即可,例如,向佇列寫入字串"123",我們僅需要呼叫put方法即可,例如:

queues.put("123")

而想要從佇列中獲取資料的話,需要使用get方法,例如:

data = queues.get()
print(data)

除此之外,還有佇列其他常用的方法,如: qsize()會返回佇列中元素的數量,empty()會判斷佇列是否為空,full()會判斷佇列是否已經滿了。

這裡舉一個檔案分發下載的例子,我們需要定義一個生產者,用於釋出任務,定義多個消費者,用於執行任務,程式碼如下:

在上述程式碼中,我們定義了生產者和消費者2個類,其初始方法__init__會傳入佇列資訊,生產者有定義了2個方法,一個是put,是將元素放入佇列中,還有一個是qsize,是返回當前佇列的個數。而消費者只定義了一個方法get,上面寫了一個死迴圈,向佇列獲取資料,每獲取到一個資料,休息15秒。

在主函數中,我們定義了一個公共的佇列queues,而後定義了生產者p和消費者q,二者都傳入了同一個佇列queues。最後我們寫了3個執行緒,用於執行消費者qget方法。 和 呼叫一個生產者方法put

執行結果為:

上述結果展現的是,生產者生成資料,而消費者接收。file_0file_9都只被消費了一次,可見佇列是自己保證了執行緒競爭問題的。

總結

本篇文章介紹了為什麼需要執行緒間通訊,以及通訊方式有哪些,最後每種通訊方式都舉了一個例子,總的來說,最常用的還是共用變數的方式來進行執行緒間通訊,但是此方法需要自己來保證執行緒競爭問題,除此之外,還有佇列和管道,此二者不用擔心執行緒競爭,但是前則更適用於生產者-消費者模型,後者更適用於兩執行緒間相互通訊。

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


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