在python經典面試試題中,有它的存在

2021-10-14 08:17:20 字數 1238 閱讀 4633

在日常開發當中,從乙個執行緒向另外的執行緒傳輸資料又是一件家常便飯的事情。舉個最簡單的例子,我們在處理網頁請求的時候,需要列印下來這一次請求的相關日誌。列印日誌是一次io行為,這是非常消耗時間的,所以我們 不能放在請求當中同步進行,否則會影響系統的效能。最好的辦法就是啟動一系列執行緒專門負責列印,後端的執行緒只負責響應請求,相關的日誌以訊息的形式傳送給列印執行緒列印。

這個簡單的不能再簡單的功能當中涉及了諸多細節,我們來盤點幾個。首先io執行緒的資料都是從後台執行緒來的,假如一段時間內沒有請求,那麼這些執行緒都應該休眠,應該在有請求的時候才會啟動。其次,如果某一段時間內請求非常多,導致io執行緒一時間來不及列印所有的資料,那麼當下的請求應該先暫存起來,等io執行緒」忙過來「之後再進行處理。

把這些細節都考慮到,自己來設計功能還是挺麻煩的。好在這個問題前人已經替我們想過了,並且得出了乙個非常經典的設計模式,使用它可以很好的解決這個問題。這個模式就是生產消費者模式。

下期為你們帶來整合的詳細**文章期待,在這期間裡你們也可以瀏覽小知的q群文章:625223082

這個設計模式的原理其實非常簡單,我們來看張圖就明白了。

執行緒根據和資料的關係分為生產者執行緒和消費者執行緒,其中生產者執行緒負責生產資料,產生了資料之後會儲存到任務佇列當中。消費者執行緒從這個佇列獲取需要消費的資料,它和生產者執行緒之間不會直接互動,避免了執行緒之間互相依賴的問題。

另外乙個細節是這裡的任務佇列並不是普通的佇列,一般情況下是乙個阻塞佇列。也就是說當消費者執行緒嘗試從其中獲取資料的時候,如果佇列是空的,那麼這些消費者執行緒會自動掛起等待,直到它獲得了資料為止。有阻塞佇列當然也有非阻塞佇列,如果是非阻塞佇列的話,當我們嘗試從其中獲取資料的時候,如果它當中沒有資料的話,並不會掛起等待,而是會返回乙個空值。

當然阻塞佇列的掛起等待時間也是可以設定的,我們可以讓它一直等待下去,也可以設定乙個最長等待時間。如果超過這個時間也會返回空,不同的佇列應用在不同的場景當中,我們需要根據場景性質做出調整。

總結今天這篇文章當中我們主要介紹了多執行緒場景中經典的生產消費者模式,也可以認為是工程師必須知道的幾種基礎設計模式之一,這個模式在許多場景當中都有使用。比如kafka等訊息系統,以及yarn等排程系統等等,幾乎只要是涉及到多執行緒上下游通訊的,往往都會用到。也正因此它的使用場景太廣了,所以它經常在各種面試當**現,

C語言經典面試試題

c語言經典面試試題 1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義...

Python經典面試題

將字串列表 aycc kh llc u l 通過演算法處理為 y k c u l 對調首尾字串的位置,拼接字串列表中的字元,組成字串 lucky lst aycc kh llc u l 生成 3,2,1,1,1 這樣乙個索引列表 lst inde 2 i if 2 i 0else 1 for i i...

python經典面試題目

print set a set b a,b中相同的元素 print set a set b a,b中不同元素list 1 a b c b a list 1 list set list 1 print list 1 alist defsort by age alist return sorted al...