哈嘍大家好,我是鵬哥。
今天想寫寫的內容是 —— 多線程的幾位“輔助”英雄。
~~~上課鈴~~~
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吧!