全域性直譯器鎖 GIL

2022-02-01 06:31:31 字數 649 閱讀 2611

gil本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖的本質都一樣,都是將併發執行變成序列,以此來控制同一時間內共享資料只能被乙個任務所修改,進而保證資料安全。

# 為何要有gil?

因為cpython直譯器自帶垃圾**機制不是執行緒安全的。

# 如果不對垃圾**機制執行緒做任何處理,也沒有gil鎖行不行?

python**的執行由python虛擬機器(也叫直譯器迴圈)來控制。python在設計之初就考慮到要在主迴圈中,同時只有乙個執行緒在執行。

雖然python直譯器中可以」執行「多個執行緒,但是任意時刻只有乙個執行緒在直譯器中執行。

對python虛擬機器的訪問由全域性直譯器鎖(gil)來控制,正是這個鎖能保證同一時刻只有乙個執行緒在執行。

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

1.設定 gil;

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

3.執行指定數量的位元組碼指令或者執行緒主動讓出控制(可以呼叫 time.sleep(0));

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

5.解鎖 gil;

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

在呼叫外部**(如c/c++擴充套件函式)的時候,gil將會被鎖定,直到這函式結束為止(由於在這種期間沒有python的位元組碼被執行,所以不會做執行緒切換)編寫擴充套件的程式設計師可以主動解鎖gil。 

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...