python 全域性直譯器鎖(GIL)的問題
阿新 • • 發佈:2018-12-12
GIL即全域性直譯器鎖,是屬於直譯器層面的互斥鎖,確切的說是CPython直譯器內部的一把鎖。GIL是為了鎖定整個直譯器內部的全域性資源,每個執行緒想要執行首先獲取GIL,而GIL本身又是一把互斥鎖,造成所有執行緒只能一個一個併發交替的執行。
GIL產生的背景 在CPython解釋內部執行多個執行緒的時候,每個執行緒都需要向直譯器內部申請相應的全域性資源,由於C語言本身比較底層,造成CPython在管理所有全域性資源的時候並不能應對所有執行緒同時的資源請求,因此為了防止資源競爭而發生錯誤,對所有執行緒申請全域性資源增加了限制-全域性直譯器鎖。
何時申請:
- 需要執行時
何時釋放:
- 執行緒執行完畢
- 執行緒超時
- 執行緒阻塞
影響:造成CPython的一個程序內的多執行緒 交替執行(併發)
避免GIL的影響:
- 多程序可以有效利用多核資源
- 使用CPython直譯器時,使用多執行緒,用C、C++編寫一個動態庫<二進位制程式碼不需要CPython直譯器>讓python呼叫這個動態庫。
- 使用單執行緒
- 換直譯器 (pypy)
Lock和GIL不是一個層面的概念:
Lock是Python語法層面的資源
GIL是CPython直譯器層面的鎖