985大學小伙掉進Python GIL鎖坑裡,官方刪除GIL鎖終於有了盼頭

2023年10月08日09:34:04 科技 1533

我們知道,現在python呢已經成為了一個非常普及的編程語言了,同時呢也已經成為了tiobe統計排名第一的語言,超過了java和C/C++

985大學小伙掉進Python GIL鎖坑裡,官方刪除GIL鎖終於有了盼頭 - 天天要聞

TIOBE 2023年9月編程語言排行榜

因為python確實學習門檻低,非常容易上手。現在幾乎所有人都會用python寫一些簡單的代碼,實現自己的需求。但是,如果沒有深入系統的學習python,也會掉進一些坑裡。今天我們就來聊一聊一個有關一個身邊985大學生掉進python 多線程GIL鎖坑裡的故事。

985大學小伙掉進Python GIL鎖坑裡,官方刪除GIL鎖終於有了盼頭 - 天天要聞

最近部門來了一個剛畢業的985研究生,人很聰明動手能力也很強,在組裡負責激光雷達相關的模塊開發。突然有一天,小伙找到我,說代碼里遇到了性能瓶頸問題,一直解決不了,很困惑。仔細了解後,知道了他在用python里的2個線程分別讀取2個激光雷達的數據然後做進一步分析處理,但發現其中一個線程的讀取效率特別低始終無法提高。這兩個線程是在同一個進程中創建的。顯然,精通python的人都知道,這裡是由於Python 進程中存在GIL鎖(也就是Global Interpreter Lock,即全局解釋器鎖)而導致的,所以我建議他改用多進程來規避這個問題,他照做之後問題得到解決。

小伙也可能是剛接觸python,現學現用,忽略了系統學習,所以導致了對GIL鎖缺乏了解,所以掉進了坑裡。可見,學習一門編程語言,系統的學習,抓住重點,打牢基礎是多麼重要,所謂磨刀不誤砍柴工。同時,勤學好問,也很重要,遇到問題要多向團隊里的人請教,當然,前提是這個團隊不內卷,和諧友好。

現在我們說回這個Pyhon中的GIL鎖。學習GIL鎖,起碼要搞清楚5個問題:1,什麼是GIL鎖;2,為什麼Python必須引入GIL鎖?3,GIL鎖什麼時候釋放?4,如何解決GIL鎖的性能問題?5,有了GIL鎖,還需要用額外的鎖嗎?

第一個問題:什麼是GIL鎖?

GIL鎖和在Python代碼中使用線程鎖Lock並不是一個層面的概念。GIL是在實現Python解釋器(CPython)時所引入的一個概念,每一個Python進程運行時都對應一個CPython解釋器進程。在CPython解釋器內部運行多個線程的時候,每個線程在解釋器內部申請相應的全局資源,為了防止資源競爭而發生錯誤,對所有線程申請全局資源增加了限制-必須獲得全局解釋器鎖GIL。每個線程想要運行首先獲取這個解釋器進程中唯一的GIL,因此Python進程中所有線程只能一個一個交替的執行。所以在Python程序里,就算使用多線程,運行在多核CPUS上,其實還是一個線程在工作,這是CPython的一個缺陷,其他語言沒有。

第二個問題:為什麼Python必須引入GIL?

Python調用的線程都是原生線程,通過C語言提供原生接口,相當於C語言的一個函數,一旦執行Python解釋器就再也不能控制它,必須等它返回結果。如果啟動n個線程,那麼這n個線程獨自執行,訪問全局資源,會造成資源競爭,結果就會有問題。CPython加入GIL,就可以在同一時間只有拿到GIL鎖的一個線程能夠工作。雖然這n個線程都啟動了,但是同一時間只能讓一個線程訪問全局數據,其他的幾個都只能等待。

第三個問題:GIL什麼時候釋放?

在當前線程執行超時後會自動釋放,python 3.x使用計時器(執行時間達到閾值後,當前線程釋放GIL)或Python 2.x,tickets計數達到100

在當前線程執行阻塞操作時會自動釋放,比如在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執行完畢後,必須重新獲取GIL,因此多線程爬取比單線程性能有提升,因為遇到IO阻塞會自動釋放GIL鎖。

第四個問題:如何解決GIL鎖的性能問題?

多線程程序在進行IO等操作時的運行速度還是要比單線程速度快,但是在運行計算密集型的程序時,需要使用CPU進行大量的計算,但由於GIL鎖的性質導致程序執行中始終都是一個CPU進行計算,所以計算速度及其緩慢,運行此類的程序不推薦使用線程,有兩種方式解決:

1,使用多進程的方式,避免GIL鎖的約束;

2,使用其他運行速度較快的語言模塊,例如C語言。

第五個問題:既然存在GIL是否意味每個線程訪問全局數據就不用加Lock互斥鎖了呢?

用戶操作全局數據還是必須加Lock,因為GIL的釋放時機我們無法控制,此時對全局數據的操作很可能並沒有完成,而不像Lock那樣我們用完才釋放。

當然,python的GIL鎖一直被開發者詬病,python官方團隊也心知肚明,所以最近Python 團隊已經正式接受了刪除 GIL 的這個提議,並將其設置為可選模式。

深度學習三巨頭之一的 Yann LeCun 發文歡呼:沒有了 GIL,現在,Python 代碼可以自由的執行多線程了。

985大學小伙掉進Python GIL鎖坑裡,官方刪除GIL鎖終於有了盼頭 - 天天要聞

深度學習三巨頭之一的 Yann LeCun 發文祝賀

CPython 核心開發者 Thomas Wouters 撰文描述了 Python 中的無 GIL 細節,並對未來發展做了展望。短期內,會將 no-GIL 構建作為一種實驗性構建模式,大概會在 3.13 版本(也有可能推遲到 3.14 版本,目前官網的python版本是3.12版本)支持,比如允許用戶關閉GIL鎖,然後在未來某個版本將no-GIL設置為默認方式。長期來看,希望 no-GIL 成為默認方式,並刪除 GIL 的所有痕迹(但不會不必要地破壞向後兼容性)。所以,python實現真正多線程的那一天也許不會太遙遠了。

好,這次我們就聊到這裡,謝謝大家的觀看,下次再見

科技分類資訊推薦

阿維塔全球研發中心啟用,與華為聯合共創進入新階段 - 天天要聞

阿維塔全球研發中心啟用,與華為聯合共創進入新階段

近日,阿維塔全球研發中心正式啟用,可容納超過1000人。接近阿維塔的知情人士透露,該辦公大樓於2024年12月啟動裝修,其核心功能是承載阿維塔與華為聯合共創團隊的協同工作。此次全球研發中心的落成啟用,預示着阿維塔與華為的聯合共創將進入更大規
銷量承壓、動銷欠佳,高玉玲如何讓海信經銷商「脫困」? - 天天要聞

銷量承壓、動銷欠佳,高玉玲如何讓海信經銷商「脫困」?

文/曹雙濤編輯/楊博丞2025年按照既定目標,海信集團整體營收需達到3000億元。但2024年除高玉玲接棒代慧忠成為海信家電董事長,網傳海信裁員3萬人、裁員比例高達20%~30%外。公開數據顯示,2024年海信集團營收2143億元。另據海信家電發佈的2024年年報顯示,當年海信家電營收和歸母凈利潤分別同比增長8.35%和17.99%,分別至9...
1699元能買到!榮耀Power有這些優缺點,選它續航焦慮真沒了! - 天天要聞

1699元能買到!榮耀Power有這些優缺點,選它續航焦慮真沒了!

有一天,一款主流手機的電池容量來到了8000mAh,且最關鍵的是,這樣的產品並沒有過多的犧牲手感,甚至可以說手感比主流旗艦機還好,這樣的一款手機也許會在其他方面稍微有所妥協,但不得不說,它確實從根源上杜絕了我們的續航焦慮問題。沒錯了!今天咱們來聊聊榮耀POWER,一款定價在千元左右產品,按照筆者的理解,榮耀是將...
倒計時3天!第二屆「興智杯」全國人工智能創新應用大賽即將啟動,線上直播預約開啟 - 天天要聞

倒計時3天!第二屆「興智杯」全國人工智能創新應用大賽即將啟動,線上直播預約開啟

前期,工業和信息化部、科學技術部、深圳市人民政府共同主辦了首屆「興智杯」全國人工智能創新應用大賽(以下簡稱「大賽」),以需求為牽引,推動了一批關鍵技術加快突破,加快人工智能與重點行業融合賦能,成為了目前國內規模最大、參賽主體最豐富的人工智能專業賽事。為進一步發揮「以賽促研、以賽促用、以賽育人」的作用...
國產芯片殺瘋了!利潤暴漲26倍,這些小芯片藏着大突破 - 天天要聞

國產芯片殺瘋了!利潤暴漲26倍,這些小芯片藏着大突破

最近翻看國產芯片企業的成績單,可把我這個外行人看樂了——利潤動輒漲個兩三倍都是常規操作,最誇張的翻了26倍!您別誤會,這可不是在炒股,而是實打實的造芯片掙來的真金白銀。要說這波國產替代的浪潮,還真讓咱們在芯片領域啃下了幾塊硬骨頭。先說個身邊
iStorage 推出 26TB 容量 diskAshur 加密硬盤,1541 美元起 - 天天要聞

iStorage 推出 26TB 容量 diskAshur 加密硬盤,1541 美元起

IT之家 5 月 5 日消息,硬盤製造商 iStorage 宣布推出 26TB 版本 diskAshur DT2/3 系列加密硬盤,相應硬盤主打「提供物理密碼按鍵」,其中 diskAshur DT2 26TB 版本售價為 1541 美元(IT之家註:現匯率約合 11147 元人民幣),diskAshur DT3 26TB 版本定價為 1814 美元(現匯率約
無線信號增強秘籍,橋接和中繼模式哪個更強? - 天天要聞

無線信號增強秘籍,橋接和中繼模式哪個更強?

【ZOL中關村在線原創技術解析】隨着無線通信與計算機技術飛速發展,人們愈發渴望隨時隨地享受穩定的數據通信服務。無線路由器作為無線網絡核心設備,作用關鍵。但當其信號覆蓋不足,如穿過兩堵牆後信號微弱時,可通過無線橋接或中繼模式連接兩個無線路由器,擴展網絡、增強信號。中繼模式和橋接模式雖都能擴展網絡覆蓋,但...
流暢更耐用 魅族Note 16將預裝Flyme 12 - 天天要聞

流暢更耐用 魅族Note 16將預裝Flyme 12

魅族官方透露,將於5月發佈的魅族Note 16系列將出廠預裝Flyme 12新系統,這也是Flyme系統大版本首次在非旗艦機型上首發。魅族Note 16搭載紫光展銳T765處理器,配備6.78英寸LCD屏,分辨率達2460*1080。後置採用八邊形相機模組,由5000萬像素主攝和200萬像素鏡頭組成。續航方面,內置6600mAh大容量電池,支持40W有線充電