Python的GIL全域性直譯器鎖

2021-10-06 16:48:57 字數 724 閱讀 5752

概念保證同一時間僅有乙個執行緒對資源有操作許可權(在乙個程序內,同一時刻只能有乙個執行緒執行)

python多執行緒中gil鎖只是在cpu操作時(如:計算)才是序列的,其他都是並行的,所以比序列快很多

為什麼會有gil

為了利用多核,python開始支援多執行緒。而解決多執行緒之間資料完整性和狀態同步,即資料安全,最簡單方法自然就是加鎖。 於是有了gil這把超級大鎖,而當越來越多的**庫開發者接受了這種設定後,他們開始大量依賴這種特性(即預設python內部物件是thread-safe的,無需在實現時考慮額外的記憶體鎖和同步操作)

gil是一把全域性排他鎖。毫無疑問全域性鎖的存在會對多執行緒的效率有不小影響。甚至就幾乎等於python是個單執行緒的程式。

而在python3.x中,gil不使用ticks計數,改為使用計時器(執行時間達到閾值後,當前執行緒釋放gil),這樣對cpu密集型程式更加友好,但依然沒有解決gil導致的同一時間只能執行乙個執行緒的問題

說明為了解決不同執行緒同時訪問同一資源時,資料保護問題,而產生了gil

gil在直譯器的層面限制了程式在同一時間只有乙個執行緒被cpu實際執行,而不管你的程式裡實際開了多少條執行緒

為了解決這個問題,cpython自己定義了乙個全域性直譯器鎖,同一時間僅僅有乙個執行緒可以拿到這個資料

python之所以會產生這種不好的狀況是因為python啟用乙個執行緒是呼叫作業系統原生執行緒,就是c介面

但是這僅僅是cpython這個版本的問題,在pypy,中就沒有這種缺陷

GIL 全域性直譯器鎖

1 描述python中gil的概念,以及它對python多執行緒的影響?編寫乙個多執行緒抓取網頁的程式,並闡明多執行緒抓取程式是否可比單執行緒效能有提公升,並解釋原因。答 gil global interpreter lock,即全域性直譯器鎖 1 python語言和gil沒有半毛錢關係。僅僅是由於...

GIL全域性直譯器鎖

gil 啥?他是如何產生的?gil產生的背景 在cpython解釋內部執行多個執行緒的時候,每個執行緒都需要直譯器內部申請相應的全域性資源,由於c語言本身比較底層造成cpython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源...

全域性直譯器鎖GIL

我們使用高併發,一次是建立1萬個執行緒去修改乙個數並列印結果看現象 from threading import thread import osdef func args global n n args print n,os.getpid n 100t list for i in range 100...