GIL全域性直譯器鎖

2021-10-07 09:26:03 字數 1412 閱讀 8168

在理解gil之前,先理解一下併發與並行的概念:

併發:cup交替執行.當任務數大於cup核數時,cpu會交替執行這兩個任務.但不是同時執行,由於cup執行的速度過快,給人的感覺像是在』同時執行』.

並行:多個cup執行多個任務.各自cup執行著各自的任務肩並肩一起前行.

併發和並行同屬於多工,目的是提高cup的使用效率.但是要明白,乙個cpu永遠不可能同時執行多個任務.可以在隨機分配的時間內交替執行.(時間片輪轉排程演算法)

guido van rossum(吉多·範羅蘇姆)建立python時就只考慮到單核cpu,解決多執行緒之間資料完整性和狀態同步的最簡單方法自然就是加鎖, 於是有了gil這把超級大鎖。因為cpython解析只允許擁有gil全域性解析器鎖才能執行程式,這樣就保證了保證同乙個時刻只允許乙個執行緒可以使用cpu。由於大量的程式開發者接收了這套機制,現在**量越來越多,已經不容易通過c**去解決這個問題。

每個執行緒在執行時都需要先獲取gil,保證同一時刻只有乙個執行緒在使用cpu,也就是說多執行緒並不是真正意義上的同時執行.

gil 是用於同步執行緒的一種機制,作用就是在任何時刻只能有乙個執行緒在執行.

即使有多個核心處理器,使用gil直譯器鎖保證同一時刻只有乙個執行緒在執行

更換cpython為jpython(不建議,更換之後講不能在使用c語言的拓展包.)

使用多程序完成多執行緒的任務(資源占用會多一些)

.在使用多執行緒可以使用c語言去實現

問題1 什麼時候會釋放gil鎖

答: 1. 遇到像i/o操作這種,會有時間空閒情況,造成cpu空閒,會釋放gil鎖

​ 2.會有乙個專門的ticks進行計數,一旦ticks數值達到100,這個時候就會釋放gil鎖,執行緒之間開始競爭gil鎖.(說明:ticks這個數值可以進行設定來延長或縮減獲得gil鎖的執行緒使用cpu的時間.)

問題2 互斥鎖和gil鎖的關係

gil鎖:保證同一時刻只有乙個執行緒能使用到cpu

互斥鎖: 多執行緒時,保證修改共享資料時有序的修改,不會產生資料的混亂

如下場景:

多執行緒執行,假設執行緒1獲取了gil可以使用cpu.這時執行緒1獲取了互斥鎖lock.執行緒1可以修改共享變數date資料

執行緒1在修改date資料前發生了i/o操作或者是ticks計數滿100,這個時候gil需要被讓出,gil可以被競爭了

執行緒1和執行緒2開始競爭gil(如果執行緒1是因為i/o阻塞讓出了gil,那執行緒2必定能拿到gil,如果是因為ticks計數滿100,則公平競爭)

假設執行緒2拿到了gil,它要去修改共享變數date資料.由於資料還被執行緒1互斥鎖lock加鎖中.所以執行緒2無法更改date,執行緒2讓出gil,再次開始競爭.

執行緒1搶到了gil,它本身就自帶著互斥鎖lock, 所以成功修改了資料,修改完成後釋放了互斥鎖lock, 執行緒2在獲取到gil和lock之後才可以對date進行修改.

以上就是互斥鎖與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...