Python之GIL的理解總結

2021-10-05 14:16:25 字數 1362 閱讀 7832

前言:並行和併發的區別,程序和執行緒,個人理解

並行:多個cpu同時執行兩個程式,兩個程式真的同時在執行。

併發:兩個程式在乙個cpu上執行,通過cpu時間片排程執行,執行的很快,看起來像並行,其實是併發,具體某乙個時間點,一定只有乙個程式在執行。

程序與執行緒:對於作業系統而言,乙個任務就是乙個程序,是擁有作業系統資源的最小單位;乙個任務可以幹多件事情,打字,拼寫檢查,列印等,把這些子任務叫執行緒,執行緒是程序執行運算的最小單位。所以,乙個程序至少有乙個執行緒,同乙個程序中的執行緒共享資源。

兩個程序同時死迴圈,會使兩個cpu100%

多執行緒同時死迴圈,會使乙個cpu100%,不會使兩個cpu100%

python的gil:假設只有乙個cpu的話,python的cpython直譯器,在每個執行緒執行前都會獲取gil鎖,保證同一時刻只有乙個執行緒執行**,所以,多執行緒並不是真正意義上的同時並行,而是併發。

如何解決gil鎖:

1.更換cpython為jpython,可行,不建議

2.使用多程序完成多執行緒的任務

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

問題: 什麼時候會釋放gil鎖?

遇到像 i/o操作這種 會有時間空閒情況 造成cpu閒置的情況會釋放gil;

會有乙個ticks計數,ticks達到100,釋放gil,多執行緒競爭gil鎖,

問題:互斥鎖和gil鎖:

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

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

1)多執行緒執行,假設thread1獲得gil可以使用cpu,這時thread1獲得 互斥鎖lock,thread1可以改date資料(但並

沒有開始修改資料)

(2)thread1執行緒在修改date資料前發生了 i/o操作 或者 ticks計數滿100 (注意就是沒有執行到修改data資料),這個

時候 thread1 讓出了gil,gil鎖可以被競爭

(3) thread1 和 thread2 開始競爭 gil (注意:如果thread1是因為 i/o 阻塞 讓出的gil thread2必定拿到gil,如果

thread1是因為ticks計數滿100讓出gil 這個時候 thread1 和 thread2 公平競爭)

(4)假設 thread2正好獲得了gil, 執行**去修改共享資料date,由於thread1有互斥鎖lock,所以thread2無法更改共享資料

date,這時thread2讓出gil鎖 , gil鎖再次發生競爭 

(5)假設thread1又搶到gil,由於其有互斥鎖lock所以其可以繼續修改共享資料data,當thread1修改完資料釋放互斥鎖lock,

thread2在獲得gil與lock後才可對data進行修改

怎樣理解python中的GIL

一,gil的概念 python全域性直譯器鎖。二,gil產生的原因 1,guido van rossum 吉多 範羅蘇姆 建立python時就只考慮到單核cpu。2,解決多執行緒之間資料完整性和狀態同步的最簡單方法自然就是加鎖。於是有了gil這把超級大鎖。3,cpython解析只允許擁有gil全域性...

GIL問題的理解

簡單說 執行緒的鎖機制與cpu的鎖 gil 粒度不一樣,gil並不能保證執行緒安全 單個位元組碼操作 原子操作 是執行緒安全的,非原子操作是多位元組碼操作 所以我理解的gil只是使一些簡單的原子操作變成了執行緒安全的 而非那些原子操作的過程仍然 需要我們自己使用鎖機制進行同步 gil保證的是位元組碼...

Python中GIL全域性直譯器鎖的理解

gil的全稱是 global interpreter lock,意思就是全域性直譯器鎖,gil並不是python的特性,只在cpython直譯器裡引入的乙個概念,而在其他的語言編寫的直譯器裡就沒有這個gil例如 jpthon import threading 子執行緒死迴圈 def test whi...