1. 程式人生 > 其它 >python全域性解釋鎖GIL設計思路分析

python全域性解釋鎖GIL設計思路分析

1、GIL的作用:保證任意時刻僅有一個執行緒在執行,防止多執行緒併發執行導致的資料異常。

2、作業系統的pthread_mutex_t也能達到執行緒互斥的作用,為什麼不用?

注:Linux 環境中,實現執行緒同步的常用方法有 4 種,分別稱為 互斥鎖 、 訊號量 、 條件變數 和 讀寫鎖 。 互斥鎖 (Mutex)又稱 互斥量 或者 互斥體 ,是最簡單也最有效地一種執行緒同步機制。

原因:不是不可以,但更麻煩一些。與GIL對比如下:

GIL是Python虛擬機器執行時,在各個Python位元組碼執行期間進行切換的。換言之,GIL可以保證位元組碼級別的執行緒安全性,不必考慮一條位元組碼執行了一半執行緒就被切換的情況,對開發人員更為友好。

而mutex是作業系統提供的機制,只能保證機器指令(彙編級別)的執行緒安全性,通常一條Python位元組碼的實現要使用非常多條的機器指令,如果沒有GIL,那CPython開發者需要頻繁的通過請求和釋放mutex來保證執行緒安全,開發量增加不說,頻繁使用mutex相比於簡單粗暴的GIL也不會帶來執行效率的提升。

另外,相比於作業系統原生的mutex,GIL更方便CPython開發者對Python執行緒進行精確控制,實現特定的功能。比如,每執行100條位元組碼,就切換一次執行緒;每5毫秒切換一次執行緒;執行緒切換時避免剛切換出去的執行緒再次切換回來造成的不公平現象等等。

3、Python執行期間處於等待GIL的執行緒,會被作業系統排程起來執行嗎?從作業系統角度看這個執行緒是處於什麼狀態?

4、GIL如何實現的?一個執行緒如何釋放GIL,如何獲取GIL?

首先,GIL是一個全域性變數,主要有三部分內容:是否鎖定,是否有執行緒請求獲取GIL,讀寫GIL的mutex

GIL的獲取:先獲取mutex,然後將GIL的請求標記設定為True,等待其它執行緒釋放GIL

GIL的釋放:每隔一定的時間或執行了一定數量的位元組碼或遇到系統IO中斷,就堅持GIL的請求標記,有其它執行緒請求GIL則自己就釋放掉,然後自己再次請求,等待其它執行緒釋放。