1. 程式人生 > >關於python中的GIL

關於python中的GIL

什麼是GIL鎖?

GIL是Global Interpreter Lock的縮寫,GIL中文可以稱為全域性直譯器鎖.提及到GIL,我們要知道它是在實現Python解析器(CPython)時所引入的一個概念。

GIL並不是python語言的特性,Python程式碼的執行由Python 虛擬機器(也叫直譯器主迴圈,CPython版本)來控制,Python 在設計之初就考慮到要在直譯器的主迴圈中,同時只有一個執行緒在執行,即在任意時刻,只有一個執行緒在直譯器中執行。對Python 虛擬機器的訪問由全域性直譯器鎖(GIL)來控制,正是這個鎖能保證同一時刻只有一個執行緒在執行。

GIL的設計簡化了CPython的實現,使得物件模型,包括關鍵的內建型別如字典,都是隱含可以併發訪問的。鎖住全域性直譯器使得比較容易的實現對多執行緒的支援,但也損失了多處理器主機的平行計算能力。但是,不論標準的,還是第三方的擴充套件模組,都被設計成在進行密集計算任務是,釋放GIL。還有,就是在做I/O操作時,GIL總是會被釋放。對所有面向I/O 的(會呼叫內建的作業系統C 程式碼的)程式來說,GIL 會在這個I/O 呼叫之前被釋放,以允許其它的執行緒在這個執行緒等待I/O 的時候執行。如果是純計算的程式,沒有 I/O 操作,直譯器會每隔 100 次操作就釋放這把鎖,讓別的執行緒有機會執行(這個次數可以通過 sys.setcheckinterval 來調整)如果某執行緒並未使用很多I/O 操作,它會在自己的時間片內一直佔用處理器(和GIL)。也就是說,I/O 密集型的Python 程式比計算密集型的程式更能充分利用多執行緒環境的好處。