Python的GIL全局解釋器鎖 - 邱乘屹的個人技術博客

GIL全局解釋器鎖

概念

保證同一時間僅有一個線程對資源有操作權限(在一個進程內,同一時刻只能有一個線程執行)
python多線程中GIL鎖只是在CPU操作時(如:計算)纔是串行的,其他都是並行的,所以比串行快很多

爲什麼會有GIL

爲了利用多核,Python開始支持多線程。而解決多線程之間數據完整性和狀態同步,即數據安全,最簡單方法自然就是加鎖。 於是有了GIL這把超級大鎖,而當越來越多的代碼庫開發者接受了這種設定後,他們開始大量依賴這種特性(即默認python內部對象是thread-safe的,無需在實現時考慮額外的內存鎖和同步操作)
GIL是一把全局排他鎖。毫無疑問全局鎖的存在會對多線程的效率有不小影響。甚至就幾乎等於Python是個單線程的程序。
而在python3.x中,GIL不使用ticks計數,改爲使用計時器(執行時間達到閾值後,當前線程釋放GIL),這樣對CPU密集型程序更加友好,但依然沒有解決GIL導致的同一時間只能執行一個線程的問題

說明

  1. 爲了解決不同線程同時訪問同一資源時,數據保護問題,而產生了GIL
  2. GIL在解釋器的層面限制了程序在同一時間只有一個線程被CPU實際執行,而不管你的程序裏實際開了多少條線程
  3. 爲了解決這個問題,CPython自己定義了一個全局解釋器鎖,同一時間僅僅有一個線程可以拿到這個數據
  4. python之所以會產生這種不好的狀況是因爲python啓用一個線程是調用操作系統原生線程,就是C接口
  5. 但是這僅僅是CPython這個版本的問題,在PyPy,中就沒有這種缺陷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章