GIL,python全域性直譯器鎖

2022-09-18 03:00:51 字數 1170 閱讀 1283

global interpreter lock,即python為了保護執行緒安全而採取的獨立執行緒執行的限制。就是乙個核心在乙個時間點只能執行乙個執行緒,對於io密集型任務,多執行緒能起到作用,對於cpu密集型,對執行緒就無能無力,反而還會因為爭奪資源而變慢。

要理解gil,就要從python的底層說起。

c++這樣的語言是編譯型語言,指程式輸入到編譯器,編譯器再根據語言的語法進行解析,然後翻譯成語言獨立的中間表示,最後鏈結成具有高度優化的機器碼的可執行程式,編譯器可以看到整個程式,或者一大塊獨立的部分,從而進行深層次的**優化。以及可以對不同的語言指令之間的互動進行推理,從而給出更有效的優化手段。

與此相反,python是解釋型語言,程式被輸入的直譯器來執行,直譯器在程式執行之前對其並不了解,它所知道僅是python的規則,以及在執行過程中如果動態的應用這些規則。它也有一些優化,但是是有別的編譯型語言優化的另一種優化,無法深入底層對程式進行推到,python的大部分優化都是直譯器自身的優化,和所寫的程式沒有什麼關係。python程式的執行速度直接與直譯器的速度相關。

問題的關鍵是,要想利用多核系統,python必須支援多執行緒執行。作為解釋型語言,python的直譯器必須做到既安全又高效,直譯器需要的做的是避免在不同的執行緒中操作內部共享的資料,同時它還要保證在管理使用者執行緒時保證總是最大化的計算資源。

那麼不同執行緒訪問時,資料的保護機制是什麼樣的?這就是gil,全域性直譯器鎖。這是加在直譯器上鎖,來保證資料的安全,諸如對當前執行緒狀態和垃圾**而用的堆分配物件這樣的東西的訪問提供保護。gil 會通過位元組碼行數以及時間片釋放,遇到io操作會主動釋放。這種方式很安全,但是它最大的缺點時,對於任何python程式,不管有多少的處理器,任何時候都總是只有乙個執行緒在執行。

解決gil的一些嘗試。新增細粒度的鎖來阻止多個物件的同時訪問,對於對執行緒這種方法是有效的,但是這個收益並沒有隨著核數的增加而線形增加。且在單執行緒時,速度大概降低40%,因此這種方法逐漸被遺忘。對於其他的python直譯器,已經有很多不使用gil,但是cpython支援的庫是最多的。

我們希望的是在移除gil時,並且對於單執行緒下的python**沒有帶來效能的下降,最想要的是乙個執行緒api能利用所有的處理器。但是多執行緒的開發和除錯是單執行緒的數倍,多執行緒沒有乙個非常成熟的應用。

目前的解決辦法就是多程序和下面的協程。協程雖然也是單cpu,但是能減小切換代價而提公升效能。

python GIL全域性直譯器鎖

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

全域性直譯器鎖(GIL)Cpython

本文介紹cpython中的全域性直譯器鎖 global interpreter lock 只有在cpython中才有奧,jpython中沒有這一機制 python中的執行緒是作業系統的原生執行緒,python虛擬機器使用乙個全域性直譯器鎖 global interpreter lock 來互斥執行緒...

python GIL 全域性直譯器鎖

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