python中GIL鎖的問題擴充套件

2021-08-19 20:38:09 字數 1142 閱讀 1597

gil全域性直譯器鎖延伸擴充套件

作用 : 保證同一時刻只有乙個執行緒能使用到cup

解釋 : 當我們使用多執行緒的時候,在乙個程序中只有乙個gil鎖,那麼這多個執行緒中誰拿到gil誰就可以

使用cpu(ps:多個程序有多個gil鎖)

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

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

2 會有乙個專門ticks進行計數 一旦ticks數值達到100 這個時候釋放gil鎖 執行緒之間開始競爭gil鎖(說明:

ticks這個數值可以進行設定來延長或者縮減獲得gil鎖的執行緒使用cpu的時間)

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

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

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

首先假設只有乙個程序,這個程序中有兩個執行緒 thread1,thread2, 要修改共享的資料date, 並且有互斥鎖

執行以下步驟

(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進行修改

以上描述了 互斥鎖和gil鎖的 乙個關係

python 執行緒GIL鎖

gil global interpreter lock cpython python中乙個執行緒對應於c語言中的乙個執行緒 gil使得同乙個時刻只有乙個執行緒在乙個cpu上執行位元組碼,無法將多個執行緒對映到多個cpu上執行 gil會根據執行的位元組碼行數以及時間片釋放gil,gil在遇到io的操作...

python全域性直譯器鎖 GIL 的問題

gil即全域性直譯器鎖,是屬於直譯器層面的互斥鎖,確切的說是cpython直譯器內部的一把鎖。gil是為了鎖定整個直譯器內部的全域性資源,每個執行緒想要執行首先獲取gil,而gil本身又是一把互斥鎖,造成所有執行緒只能乙個乙個併發交替的執行。注意多個python程序 多個gil鎖 gil產生的背景 ...

Python解決GIL鎖的辦法

當機器無論是有幾個核心,python多執行緒都只會用到其中乙個核心。利用htop命令可以測試出來。這個並沒有解決資料共享出現不同步的問題 coding utf 8 import threading 子執行緒死迴圈 deftest while true pass t1 threading.thread...