首先丟擲問題:
1.gil鎖和執行緒互斥鎖在整個程式中有何屌用?鎖的是什麼?
2.多執行緒究竟是如果競爭offer?作業系統-直譯器-執行多執行緒的流程?
直接貼圖(個人理解+參考繪製,如有問題,請指正 ^)
解釋:
t1():
1.執行緒1和執行緒2分別讀取共享資料池變數a的指標
2.t1競爭到gil鎖,cpython直譯器儲存鎖狀態(t1占用)
3.t1交給作業系統,os呼叫原生執行緒,將t1交給 cpu1
4.cpu1(每一步都是一條cpu指令)
4.1 讀取a指標載入全域性變數 0
4.2 載入常量1
4.3 完成 0+1 運算
!!! os分配給t1的時間片到
5.t1無奈返回直譯器,釋放gil鎖,直譯器儲存鎖狀態(無占用)
6.直譯器儲存t1執行狀態,t1等待下次呼叫
t2():
7.t2獲得gil鎖,直譯器儲存鎖狀態(t2占用)
8.t2交給作業系統,os呼叫原生執行緒,將t2交給 cpu4
9.cpu4
9.1 讀取a指標(此時t1未執行完,a處於locked狀態)
9.2 阻塞.....等待時間片到
10.t2無奈返回直譯器,釋放gil鎖,直譯器儲存鎖狀態(無占用)
t1(2):
11.t1競爭到gil鎖,讀取上次執行狀態,直譯器儲存鎖狀態(t1占用)
12.t1交給作業系統,os呼叫原生執行緒,將t1交給 cpu1
13.cpu1
## 接著上次執行狀態
4.4 將計算結果返賦值給 指標a (此時全域性變數a已改變)
4.5 等待時間片....
4.6 os分配給t1的時間片到
14.t1返回直譯器,釋放執行緒互斥鎖,並結束執行緒
15.t1釋放gil鎖,直譯器儲存鎖狀態(無占用)
t2(2):
16.t2獲得gil鎖,直譯器儲存鎖狀態(t2占用)
17.t2交給作業系統,os呼叫原生執行緒,將t2交給 cpu4
18.cpu4
## 接著上次執行狀態
9.3 讀取a指標載入全域性變數 1
9.4 載入常量1
9.5 完成 1+1 運算
9.6 時間片
未到 :將結果返回給全域性變數a
到了 : 返回直譯器交出gil等待下次呼叫
19.t2返回直譯器,結束執行緒2,直譯器儲存鎖狀態(無占用)[t2在時間片之內完成運算並且成功返回值]
純屬個人理解,**標註,thanks ^.* GIL直譯器鎖,執行緒補充
gil是乙個互斥鎖 存在於cpython 保證資料的安全 以犧牲效率換區資料的安全性 阻止同乙個程序內多個執行緒同時執行 不能並行但是能夠實現併發 併發 發起來像是同時進行的 gil全域性直譯器存在的原因是cpython直譯器的記憶體管理不是執行緒安全的 同乙個程序下多個執行緒不能實現並行但能實現併...
GIL鎖,執行緒池,同步非同步
1.gil 是乙個全域性直譯器鎖 是一種互斥鎖 為什麼需要gil 因為乙個python.exe程序中只有一分直譯器,如果這個程序開啟了多個執行緒都要執行 多執行緒之間要競爭直譯器,一旦競爭就有可能出現問題 帶來的問題 同一時間只有乙個執行緒可以訪問直譯器 好處 保證了多執行緒的資料完全 thread...
Python多執行緒與GIL
gil global interpreter lock 是在實現python解析器 cpython 時所引入的乙個概念。但值得注意的是,gil並不一定是所有python編譯器均必須的,如jpython就沒有gil。gil是python為解決多執行緒之間資料完整性和狀態同步的辦法,類似於在存在乙個全域...