搜尋

首頁  >  問答  >  主體

cpython引入GIL的目的到底是什么,求详解?

查了很多资料,这些资料基本直说到GIL会让是字节码只让一个线程执行,但是为什么要这么做的原因,都感觉没说的很彻底。所以想请高人解惑!!

PHP中文网PHP中文网2810 天前735

全部回覆(2)我來回復

  • 怪我咯

    怪我咯2017-04-17 16:19:33

    在python之父的一些談話中,可以看出一些些貓膩。

    有些聽眾問到global interpreter lock(GIL),想要更深入了解這個問題,以及這個問題是如何解決的。 Van Rossum笑著反問:「你有多少時間?」他簡短的講述了GIL產生的歷史。在Python誕生後,多核心計算機出現了。當執行緒運行在不同的核心時,兩個或更多的處理器要更新同一個物件便產生了競爭機制,特別是在Python垃圾回收處理機制中。

    一個合理的解決方案就是給每個物件上鎖,這樣可以保護資料不被多路存取破壞。但結果導致當沒有鎖的競爭時,上鎖和解鎖操作代價高昂。一些實驗表明,不需要上鎖的單執行緒程式效能會因此降低2倍。這意味著只有在使用三個或多個執行緒或核心的程式會從中獲益。

    因此,GIL 誕生了(儘管這個名字在它被添加到解釋器後很久才出現)。它是一個立刻有效鎖定所有物件的單一鎖,這樣所有物件存取將排序進行。目前的問題是,10年或15年以後,多核心處理器無所不在,人們想要不必進行多重處理就可利用它們(例如,使用獨立的進程而不是線程通訊)

    他說,如果你當今想要設計一種新語言,要讓它沒有易變的對象,或是有限的易變性。然而,聽眾中傳來「這就不是 Python 了」。 Van Rossum 贊成的說:「你說了我要說的話」。 GIL 周圍有許多開發者不斷的努力,包括 PyPy 軟體事務記憶體(STM),以及 PyParallel。其他開發者也撞破了腦袋在想解決辦法。如果有人知道有什麼辦法能夠移除 GIL 且讓語言保持 Python 特性,Van 和其他人將很樂意聽到。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 16:19:33

    因為鎖的粒度越小, 實現起來越複雜, 而且可能還會因為鎖而降低性能. 所以就加了全域大鎖.

    回覆
    0
  • 取消回覆