Python提高:關於GIL(全域性直譯器鎖)與執行緒互斥鎖的理解

賈富程發表於2018-09-11

全域性直譯器鎖簡稱:GIL(Global Interperter Lock)。首先需要明確一點就是,GIL並不是Python語言的特性,它是在現實Python直譯器時引用的一個概念。GIL只在CPython直譯器上存在。作用是保證同一時間內只有一個執行緒在執行。

執行緒互斥鎖和GIL的區別

1.執行緒互斥鎖是Python程式碼層面的鎖,解決Python程式中多執行緒共享資源的問題(執行緒資料共共享,當各個執行緒訪問資料資源時會出現競爭狀態,造成資料混亂);

2.GIL是Python解釋層面的鎖,解決直譯器中多個執行緒的競爭資源問題(多個子執行緒在系統資源競爭是,都在等待物件某個部分資源解除佔用狀態,結果誰也不願意先解鎖,然後互相等著,程式無法執行下去)。

GIL對程式有啥影響

1.Python中同一時刻有且只有一個執行緒會執行;

2.Python中的多個執行緒由於GIL鎖的存在無法利用多核CPU;

3.Python中的多執行緒不適合計算機密集型的程式;

4.如果程式需要大量的計算,利用多核CPU資源,可以使用多程式來解決。

GIL 的存在使程式無法充分利用CPU進行運算,那麼它真的一無是處麼? 再進一步分析,程式分為兩種,一種是上面提到的計算密集型程式,另一種叫作IO密集型程式。

大部分的程式在執行時,都需要大量IO操作,比如網路資料的收發,大檔案的讀寫,這樣的程式稱為IO密集型程式。

IO密集型程式在執行時,需要大量的時間進行等待,那麼這時如果IO操作不完成,程式就無法執行後面的操作,導致CPU空閒。

那麼 GIL 對於這種IO密集型程式會有什麼影響?

在直譯器解釋執行任何 Python 程式碼時,都需要先獲得這把鎖才行,在遇到 I/O 操作時會釋放這把鎖。如果是純計算的程式,沒有 I/O 操作,直譯器會每隔 100 次操作就釋放這把鎖,讓別的執行緒有機會執行,提高Python程式的執行效率。

如何改善GIL產生的問題

因為 GIL 鎖是直譯器層面的鎖,無法去除 GIL 鎖在執行程式時帶來的問題。只能去改善。

1.更換更高版本的直譯器,比如3.6,從3.2版本開始,據說Python對解釋做了優化

2.更換直譯器,比如JPython,但是由於比較小眾,支援的模組較少,導致開發的效率降低

3.Python為了解決程式使用多核的問題,使用多程式代替多執行緒


相關文章