1. 程式人生 > >[py]GIL(全局解釋器鎖)

[py]GIL(全局解釋器鎖)

cnblogs logs blog .cn mark 一行 解析 read 啟動

參考: http://www.cnblogs.com/iiiiiher/p/8341091.html

GIL(全局解釋器鎖)

參考
我的機器有4核,代表著同一時間,可以幹4個任務。如果單核cpu的話,我啟動10個線程,我看上去也是並發的,因為是執行了上下文的切換,讓我看上去是並發的。但是單核永遠肯定時串行的,它肯定是串行的,cpu真正執行的時候,因為一會執行1,一會執行2.。。。。正常的線程就是這個樣子的。但是,在python中,無論你有多少核,永遠都是假象。無論你是4核,8核,還是16核.......不好意思,同一時間執行的線程只有一個(線程),它就是這個樣子的。這個是python的一個開發時候,設計的一個缺陷,所以說python中的線程是假線程。

技術分享圖片

參考

GIL(全局解釋器鎖)

我們知道多進程(mutilprocess) 和 多線程(threading)的目的是用來被多顆CPU進行訪問, 提高程序的執行效率。 但是在python內部存在一種機制(GIL),在多線程 時同一時刻只允許一個線程來訪問CPU。
GIL 並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。
Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。像其中的JPython就沒有GIL。然而因為CPython是大部分環境下默認的Python執行環境。所以在很多人的概念裏CPython就是Python,也就想當然的把 GIL 歸結為Python語言的缺陷。所以這裏要先明確一點:GIL並不是Python的特性,Python完全可以不依賴於GIL。

技術分享圖片

技術分享圖片

雖然python支持多線程,但是由於GIL的限制,在實際運行時,程序運行後開啟多個線程,但在通過GIL後同時也只能有一個線程被CPU執行。

GIL(全局解釋器鎖)

參考: http://www.cnblogs.com/zephyr-1/p/6043785.html
GIL並不是Python的特性,他是CPython引入的概念,是一個全局排他鎖。

解釋執行python代碼時,會限制線程對共享資源的訪問,直到解釋器遇到I/O操作或者操作次數達到一定數目時才會釋放GIL。
所以,雖然CPython的線程庫直接封裝了系統的原生線程,但CPython整體作為一個進程,同一時間只會有一個獲得GIL的線程在跑,其他線程則處於等待狀態。這就造成了即使在多核CPU中,多線程也只是做著分時切換而已,所以多線程比較適合IO密集型,不太適合CPU密集型的任務。

同一時刻一個解釋進程只有一行bytecode 在執行

技術分享圖片

python多線程為什麽不能利用多核cpu

[py]GIL(全局解釋器鎖)