[python筆記] Gil全局解釋鎖和線程互斥鎖的關(guān)系

Gil全局解釋鎖延伸擴展

作用 : 保證同一時刻只有一個線程能使用到cpu

解釋 : 當(dāng)我們使用多線程的時候,在一個進程中只有一個GIL鎖,那么這多個線程中誰拿到GIL誰就可以使用cpu(ps:多個進程有多個Gil鎖)

問題1: 什么時候會釋放Gil,

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

? ? ? 2會有一個專門ticks進行計數(shù) 一旦ticks數(shù)值達到100這個時候釋放Gil鎖 線程之間開始競爭Gil鎖(說明:ticks這個數(shù)值可以進行設(shè)置來延長或者縮減獲得Gil鎖的線程使用cpu的時間)

問題2: 互斥鎖和Gil鎖的關(guān)系

Gil鎖? :保證同一時刻只有一個線程能使用到cpu

互斥鎖 : 多線程時,保證修改共享數(shù)據(jù)時有序的修改,不會產(chǎn)生數(shù)據(jù)修改混亂

首先假設(shè)只有一個進程,這個進程中有兩個線程 Thread1,Thread2, 要修改共享的數(shù)據(jù)data, 并且有互斥鎖

執(zhí)行以下步驟

(1)多線程運行,假設(shè)Thread1獲得GIL可以使用cpu,這時Thread1獲得 互斥鎖lock,Thread1可以改date數(shù)據(jù)(但并沒有開始修改數(shù)據(jù))

(2)Thread1線程在修改date數(shù)據(jù)前發(fā)生了 i/o操作 或者 ticks計數(shù)滿100

(注意就是沒有運行到修改data數(shù)據(jù)),這個時候 Thread1 讓出了Gil,Gil鎖可以被競爭

(3) Thread1 和 Thread2 開始競爭Gil (注意:如果Thread1是因為i/o 阻塞 讓出的Gil Thread2必定拿到Gil,如果Thread1是因為ticks計數(shù)滿100讓出Gil這個時候Thread1 和 Thread2 公平競爭)

(4)假設(shè) Thread2正好獲得了GIL, 運行代碼去修改共享數(shù)據(jù)date,由于Thread1有互斥鎖lock,所以Thread2無法更改共享數(shù)據(jù)date,這時Thread2讓出Gil鎖, GIL鎖再次發(fā)生競爭

(5)假設(shè)Thread1又搶到GIL,由于其有互斥鎖Lock所以其可以繼續(xù)修改共享數(shù)據(jù)data,當(dāng)Thread1修改完數(shù)據(jù)釋放互斥鎖lock,Thread2在獲得GIL與lock后才可對data進行修改

以上描述了 互斥鎖和Gil鎖的 一個關(guān)系

總結(jié):

1.線程鎖是fine-grained(細粒度)的鎖,程序員需要自行加/解鎖來保證線程安全;

2.全局解釋鎖是coarse-grained(粗粒度)的鎖,語言層面本身維護著一個全局的鎖機制用來保證線程安全;

前一種方式比較典型的是 Java, Jython 等, 后一種方式比較典型的是 CPython (即Python)。

所以,線程互斥鎖和全局解釋鎖的關(guān)系,前一個是程序自定義的線程鎖,后一個是CPython強加給解釋器的全局線程鎖,從本質(zhì)上來講,兩者并沒有太大區(qū)別,都是為了線程安全而設(shè)計的,只是GIL比較惡心,沒法移除,并強行執(zhí)行,導(dǎo)致python的多線程成為偽并發(fā)的多線程,每一時刻,python一個進程下有且只有一個線程能獲取到GIL鎖執(zhí)行任務(wù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容