GIL 全域性直譯器鎖

2022-02-26 21:31:30 字數 1036 閱讀 5670

現在絕大部分的python都是cpython直譯器(但不是必須使用cpython直譯器),而cpython的乙個特性就是有gil,作用保證直譯器級別的**在執行時不被其他的執行緒進行修改,即加鎖處理。

造成的影響是:在同乙個時刻內乙個程序內的多個執行緒只能有乙個執行緒被執行。但是要注意:gil不是python的特性,而是python所使用的直譯器的特性。

gil的本質就是一把互斥鎖,既然是互斥鎖,它們的本質都是將併發執行變成序列執行,使在同一時刻內,共享資料只能被乙個進行內的乙個任務(執行緒)修改,從而保證資料的安全。

可以肯定的是,保證不同級別的資料的安全,就應該加不同的鎖。

在cpython中有兩種級別的資料:

直譯器級別資料:直譯器**和執行緒傳入的**所構成的資料集。

使用者自定義資料:使用者在程式中自定義的資料集。

所有執行緒的任務,都需要將任務的**當做引數傳給直譯器的**去執行,即所有的執行緒要想執行自己的任務,首先需要解決的是能夠訪問到直譯器的**,而直譯器**是所有執行緒的共享資料,也就是說任何的執行緒都可以訪問到直譯器**,但是能訪問到不代表可以獲取直譯器**的執行許可權。因此,執行緒在執行時,首先要做的就是獲取直譯器的執行許可權。總有乙個執行緒先得到直譯器的執行許可權,那麼其它的執行緒就要處於等待狀態。執行緒在獲取到執行許可權後,首先為直譯器級別資料(直譯器**+執行緒**)進行加鎖,該鎖便是gil鎖,防止其他的執行緒在該執行緒沒有解鎖之前對直譯器的使用,只有在該執行緒釋放掉直譯器的執行許可權之後,其他的執行緒才能進行爭奪。

gil的作用物件是所有的執行緒(同一程序的執行緒+非同一程序的執行緒),這把鎖保證的只是直譯器級別資料的安全性,但是不能保證使用者資料級別的資料的安全性,解決這一問題,需要的就是另一把鎖:互斥鎖。互斥鎖針對的是同一程序之間的共享資料,再某一線程對其修改時,不能被其它的執行緒修改,保證了資料的安全性。

結果:計算型---------------------------->多核--------------------------------->採用多程序

io型------------------------------->多核--------------------------------->採用多執行緒

GIL 全域性直譯器鎖

1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...

GIL全域性直譯器鎖

gil 啥?他是如何產生的?gil產生的背景 在cpython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於c語言本身比較底層造成cpython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源...

全域性直譯器鎖GIL

我們使用高併發,一次是建立1萬個執行緒去修改乙個數並列印結果看現象 from threading import thread import osdef func args global n n args print n,os.getpid n 100t list for i in range 100...