本文介紹cpython中的全域性直譯器鎖(global interpreter lock)。(只有在cpython中才有奧,jpython中沒有這一機制)
python中的執行緒是作業系統的原生執行緒,python虛擬機器使用乙個全域性直譯器鎖(global interpreter lock)來互斥執行緒對python
虛擬機器的使用。為了支援多執行緒機制,乙個基本的要求就是需要實現不同執行緒對共享資源訪問的互斥,所以引入了gil。
gil:在乙個執行緒擁有了直譯器的訪問權之後,其他的所有執行緒都必須等待它釋放直譯器的訪問權,即使這些執行緒的下一條指令並不會互相影響。在呼叫任何python c api之前,要先獲得gil
gil缺點:多處理器退化為單處理器;優點:避免大量的加鎖解鎖操作
python支援多執行緒,而解決多執行緒之間資料完整性和狀態同步的最簡單方法自然就是加鎖。 於是有了gil這把超級大鎖,而當越來越
多的**庫開發者接受了這種設定後,他們開始大量依賴這種特性(即預設python內部物件是thread-safe的,無需在實現時考慮額
外的記憶體鎖和同步操作)。慢慢的這種實現方式被發現是蛋疼且低效的。但當大家試圖去拆分和去除gil的時候,發現大量庫**開
發者已經重度依賴gil而非常難以去除了。有多難?做個模擬,像mysql這樣的「小專案」為了把buffer pool mutex這把大鎖拆分成
各個小鎖也花了從5.5到5.6再到5.7多個大版為期近5年的時間,並且仍在繼續。mysql這個背後有公司支援且有固定開發團隊的產
品走的如此艱難,那又更何況python這樣核心開發和**貢獻者高度社群化的團隊呢?
無論你啟多少個執行緒,你有多少個cpu, python在執行乙個程序的時候會淡定的在同一時刻只允許乙個執行緒執行。
所以,python是無法利用多核cpu實現多執行緒的。
這樣,python對於計算密集型的任務開多執行緒的效率甚至不如序列(沒有大量切換),但是,對於io密集型的任務效率還是有顯著提公升
的。
**:
python GIL全域性直譯器鎖
什麼是gil python 的執行由python 虛擬機器 也叫直譯器主迴圈,cpython版本 來控制,python 在設計之初就考慮到要在直譯器的主迴圈中,同時只有乙個執行緒在執行,即在任意時刻,只有乙個執行緒在直譯器中執行。對python 虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...
python GIL 全域性直譯器鎖
在vmware虛擬軟體中將ubuntu設定為單核cpu 主線程死迴圈,佔滿cpu while true pass在vmware虛擬軟體中將ubuntu設定為雙核cpu import threading 子執行緒死迴圈 deftest while true pass t1 threading.thre...
GIL 全域性直譯器鎖
1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...