python中GIL和互斥鎖最通俗易懂的解釋

2021-09-03 02:56:02 字數 736 閱讀 8355

寫在最前面:

明確乙個概念,gil只在乙個程序中唯一,多個程序gil不衝突,那麼互斥鎖又是什麼呢?

首先假設只有乙個程序,這個程序中有兩個執行緒 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鎖和自定義互斥鎖

from threading import thread,lock,current thread import time n 100 mutex lock def task global n mutex.acquire time.sleep 1 print current thread getnam...

多執行緒競爭 鎖 互斥鎖 死鎖 GIL

同乙個程序裡執行緒是資料共享的,當各個執行緒訪問資料資源時會出現競爭狀態,資料幾乎同步會被多個執行緒占用,造成資料混亂。python提供的對執行緒控制的物件。鎖的好處 確保了某段關鍵 只能由乙個執行緒從頭到尾完整地執行 鎖的壞處 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執...

互斥鎖 死鎖 遞迴鎖 訊號量 GIL鎖

互斥鎖lock也是一種阻塞,可以保證共享資料操作的完整性。保證在任一時刻,只能有乙個執行緒訪問該物件 from multiprocessing import process from threading import thread from multiprocessing import lock 程...