python GIL全域性直譯器鎖

2021-07-29 16:00:43 字數 896 閱讀 3633

什麼是gil

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

在多執行緒環境中,python 虛擬機器按以下方式執行:

1. 設定gil

2. 切換到乙個執行緒去執行

3. 執行:

a. 指定數量的位元組碼指令,或者

b. 執行緒主動讓出控制(可以呼叫time.sleep(0))

4. 把執行緒設定為睡眠狀態

5. 解鎖gil

6. 再次重複以上所有步驟

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 程式比計算密集型的程式更能充分利用多執行緒環境的好處

python GIL 全域性直譯器鎖

在vmware虛擬軟體中將ubuntu設定為單核cpu 主線程死迴圈,佔滿cpu while true pass在vmware虛擬軟體中將ubuntu設定為雙核cpu import threading 子執行緒死迴圈 deftest while true pass t1 threading.thre...

python GIL(全域性直譯器鎖)

cpython直譯器中存在乙個gil 全域性直譯器鎖 他的作用就是保證同一時刻只有乙個執行緒可以執行 因此造成了我們使用多執行緒的時候無法實現並行 每個執行緒在執行的過程都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行 執行緒釋放gil鎖的情況 在io操作等可能會引起阻塞的system cal...

Python GIL(全域性直譯器鎖)

在使用多執行緒的時候,由於使用的是c語言的直譯器,c語言直譯器存在乙個歷史問題,那就是同一時刻只能執行乙個執行緒,這就使得需要不停的來回切換執行緒的,每個執行緒在執行的過程都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行 gil就相當於乙個鎖,當乙個執行緒用時將執行緒鎖上,其他執行緒不能用,在...