1. 程式人生 > >python的多線程為什麽不能利用多核CPU?

python的多線程為什麽不能利用多核CPU?

虛擬 pytho 能夠 並發 我們 就是 比較 inter 情況

python 為什麽不能利用多核CPU
GIL:
1)其實是因為在python中有一個GIL(Global Interpreter Lock),中文為:全局解釋器鎖。
1、是最開始python為了數據安全設計了這個GIL。
2、每個CPU在同一時間只能執行一個線程:
(在單核CPU下的多線程其實都只是並發,不是並行,並發和並行從宏觀上來講都是同時處理多路請求的概念。
但並發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔內發生。)

2)在python多線程下,每個線程的執行方式如下:
1、獲取GIL
2、執行代碼直到sleep或者是python虛擬機將其掛起。
3、釋放GIL

3)為什麽有時候多線程效率低於單線程?
1、如上我們可以知道,在python中想要某個線程要執行必須先拿到GIL這把鎖,且python只有一個GIL,拿到這個GIL才能進入CPU執行,
在遇到 I/O 操作時會釋放這把鎖。如果是純計算的程序,沒有 I/O 操作,解釋器會每隔 100次操作就釋放這把鎖,讓別的線程有機會
執行(這個次數可以通過sys.setcheckinterval 來調整)。所以雖然 CPython 的線程庫直接封裝操作系統的原生線程,但 CPython
進程做為一個整體,同一時間只會有一個獲得了 GIL 的線程在跑,其它的線程都處於等待狀態等著 GIL 的釋放。
2、而每次釋放GIL鎖,線程進行鎖競爭、切換線程,會消耗資源。並且由於GIL鎖存在,python裏一個進程永遠只能同時執行一個線程
(拿到GIL的線程才能執行),這就是為什麽在多核CPU上,python的多線程效率並不高。

4)python的多線程是否就完全沒有用了呢?相同的代碼,為何有時候多線程會比單線程慢,有時又會比單線程快?
這主要跟運行的代碼有關:
1、CPU密集型代碼(各種循環處理、計數等等),在這種情況下,由於計算工作多,ticks計數很快就會達到100閾值,然後觸發GIL的釋放與再競爭
(多個線程來回切換當然是需要消耗資源的),所以python下的多線程遇到CPU密集型代碼時,單線程比多線程效率高。
2、IO密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,而開啟多線程能在
線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率)。進行IO密集型的時候可以進行分時切換 所有這個時候多線程快過單線程

5)如果python想充分利用多核CPU,可以采用多進程,
每個進程有各自獨立的GIL,互不幹擾,這樣就可以真正意義上的並行執行,所以在python中,多進程的執行效率優於多線程(僅僅針對多核CPU而言)。
所以在多核CPU下,想做並行提升效率,比較通用的方法是使用多進程,能夠有效提高執行效率。

 






python的多線程為什麽不能利用多核CPU?