【Python成長之路】來聊聊多線程的幾位“輔助”

哈嘍大家好,我是鵬哥。

 

今天想寫寫的內容是 —— 多線程的幾位“輔助”英雄

 

~~~上課鈴~~~

 

Jiaye&<em>Tonylgy</em>-Astronomia(Remix)[DubstepVer.]- Astrornomia(DubstepVer.)

1

寫在前面

最近新賽季上分好艱難,我的火都督都勝率連敗,哎,要是有個優秀的輔助該有多好。

回到正題,之前我寫過一篇多線程和多進程的文章:

【Python成長之路】python併發學習:多進程與多線程的用法及場景介紹

今天我再補充講講多線程的多位“輔助英雄”:鎖、信號量、事件。

2

多線程示例

在介紹幾位多線程方法前,我們先回歸下多線程的使用。

在不使用各類方法時,多線程代碼的結果爲:運行時間爲15S(5S爲主函數等待時間,10S是子線程運行運行時間),即3個線程是同時運行的。另外,從結果中,可以看到多線程之間是隨機運行的,可以說是相當混亂。

缺點:當前多個子線程存在相互搶佔資源,會出現同一秒內同時打印hello的情況;另外子線程之間是亂序的,沒有先來後到。

注:不知道爲什麼,微信公衆號裏設置代碼功能不生效,因此只能截圖了

3

鎖示例

針對多線程裏的鎖方法,其實是將第一個子線程在運行時,將其他線程進行上鎖,不讓他們運行。有點像遊樂場裏,小朋友們在玩滑梯時,工作人員將他們一個個排隊分好,在其中一個小朋友在玩時,其他小朋友不允許進入滑梯。

對應代碼如下:

由於thread_demo方法代碼是完全一樣的,所以我就不再重複複製了。

加入鎖後,運行結果爲:運行時間爲35S(5S爲主函數等待時間,10*3 爲3個子線程運行的總共時間),因爲加入鎖後,各子線程成了串行運行。

優點:加入鎖後,子線程是依次運行,不再混亂;

缺點:整個程序運行時間將根據子線程數量成倍。

4

信號量示例

信號量的意思,是在一定線程數量內,允許他們亂序;當超出規定數量後,剩餘的線程要進行等待。又比如遊樂場裏,碰碰車場地裏允許10個小朋友同時進入,並由他們隨機搶佔自己想要的碰碰車;對超過10的小朋友只能等待第二場進入。

示例代碼事下:

同樣,針對信號量的使用方法,thread_demo方法代碼也是一樣的。

加入信號量後,運行結果是:總共運行時間是25S(因爲信號量是2,即2個子線程是同時運行的,第3個子線程是等他們結束後才運行,所以5+10+10=25);並且信號量裏的線程打印hello是亂序的。

優點:加入信號量後,可以適時調整併發線程數量,相當於鎖和基礎用法之間的中間態;

缺點:當信號量不足時,相當於鎖的功能,後續子線程需要等待;當信號量過大時,相當於基礎用法,即隨機搶佔資源。

5

事件示例

事件的引入,相當於在事件條件發生後才能允許子線程運行。怎麼理解呢?比如遊樂場裏,小朋友們想去玩碰碰車,這時要家長同意。如果家長不同意,即使場地裏空無一人,小朋友也不能進行玩。家長同意的動作,即多線程裏的事件。

示例代碼 如下:

從代碼上看,除了hello函數需要做事件啓動的判斷外,thread_demo需要設置set();在未set()之間,子線程只能wait。

對應結果如下:總共運行時間爲15S(5S爲主函數等待時間,10S爲子線程d的運行時間)。對於a/b/c三個子線程是waiting,當set後,進行hello打印。所以真正運行的只有線程d。

優點:根據不同事件,子線程可以實現不同的功能;相當於水龍頭形狀,即可以控制熱水和冷水。

缺點:當事件發生後,子線程運行和基本用法是一樣的,仍然是亂序的。就像家長們同意小朋友們進入遊樂場後,小朋友們之間仍然是各自相互搶佔。

 

好啦,鎖、信號量、事件的簡單使用方法已經介紹完了,我要繼續峽谷一日遊了!

 

~~~下課鈴~~~

 

【往期熱門文章】:

【Python成長之路】10行代碼教你免費觀看無廣告版的《慶餘年》騰訊視頻

【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令

【Python成長之路】從 零做網站開發 -- 基於Flask和JQuery,實現表格管理平臺

 

點擊下方詩句,可以留言互動喔  

平生一顧,至此終年。江湖路遠,同去同歸。

 

【關注“鵬哥賊優秀”公衆號,回覆“python學習材料”,將會有python基礎學習、機器學習、數據挖掘、高級編程教程等100G視頻資料,及100+份python相關電子書免費贈送!】

 

掃描二維碼

    與鵬哥一起

學python吧!

發佈了38 篇原創文章 · 獲贊 17 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章