多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

Python 中央處理器 電腦 2018頭條記憶 杜哥說python 2019-04-06

大家在學習一門計算機語言,不可避免的要考慮到運行效率問題,例如爬取多個網頁時,是否可以利用計算機多核,實現程序併發運行,再比如內存數據交換、文件的讀寫、或者網絡通信,總會出現阻塞IO,是否可以通過增加進程,將阻塞狀態變成非阻塞狀態。

此時,多任務編程重要性就顯現出來了,多任務編程就是充分利用計算機資源,同時運行多個任務,提高程序整體的運行效率,實現手段就是大家熟知的多進程和多線程操作,也就是所謂的並行和併發,並行就是多個計算機核心在同時處理多個任務,這時多個任務之間是並行關係,所佔資源會比較多;而併發是指同時運行多個任務,一個內核在多個任務間不斷切換,達到多個任務都會被執行的處理效果,此時多個任務間是併發關係。

解釋了並行和併發,就不難理解進程和線程了,進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎,而一個進程包含多個線程,線程也是一種多任務編程方式,可以使用計算機的多核資源,是計算機內核使用的最小單位,那python中的多進程和多線程誰的效率更高呢?小編用IO密集和CPU密集兩種狀態對單進程、多進程、多線程進行比較測試,下面直接撂代碼。

首先是測試對象:IO密集和CPU密集實例,這裡以200萬次的“hello world”讀寫操作作為IO密集測試樣例,以700萬次累加操作作為CPU密集測試樣例:

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

IO密集和CPU密集測試樣例

下面先進行單進程操作:

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

單進程操作(IO密集和CPU密集)

然後是多進程操作:

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

多進程操作(IO密集)

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

多進程操作(CPU密集)

最後是多線程操作:

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

多線程操作(IO密集)

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

多線程操作(CPU密集)

運行結果彙總如下:

多進程 VS 多線程:Python執行效率如何?IO和CPU告訴你

單進程、多進程、多線程運行結果

根據結果可以看出,分別測試單進程、多進程、多線程執行相同的IO操作和cpu操作的時間,cpu消耗中:單進程為7.44s,多進程為4.04s,多線程為7.90s;在io消耗中,單進程為6.19s,多進程為2.94s,多線程為5.74s。無論是CPU(計算)密集型程序或是IO密集型程序,多進程併發優於多線程併發,並且在CPU(計算)密集型程序中,多線程比單進程效率還慢,在IO密集型程序中,多線程優勢也不是很明顯,究其原因,都繞不開Python的全局解釋器鎖的問題,即GIL問題。

但python的多線程並不是一無是處,對於高延遲和多阻塞的IO事件,可以像非阻塞IO一樣,通過屬性和超時檢測發送錯誤,再通過捕捉錯誤跳過該阻塞IO,先併發其他IO事件,可以節省效率,在這方面python多線程的創建刪除消耗的資源遠小於多進程,大概是進程的1/20,因此到底選用多進程還是多線程時,小編為大家總結了以下經驗:如果一個進程中併發任務比較多,比較簡單,適合使用多線程;如果數據程序比較複雜,特別是可能多個任務通信比較多的時候,要考慮到使用線程同步互斥的複雜性;如果多個任務存在明顯差異,和功能分離的時候,可以考慮使用多進程。

受制於水平的有限,這裡只從IO密集和CPU密集兩個方面對單進程、多進程和多線程進行了對比。需要交流和切磋的讀者朋友,請在評論區積極留言,歡迎關注頭條號:杜哥說python。

相關推薦

推薦中...