Python與全域性直譯器鎖

weixin_51926256發表於2020-10-25

全域性直譯器鎖(Global Interpreter Lock,簡稱CI.)是計算機程式設計語言直譯器用於同步執行緒的工具,保證任何時刻僅有一個執行緒在執行
首先要申明的是,全域性直譯器鎖並不是Python語言的特性,全域性直譯器鎖是為了實現Pythoo直譯器(主要是CPython,最流行的Python直譯器)而引人的概念,並不是所有Python直譯器都有全域性直譯器鎖。Jython和lronPython沒有全域性直譯器鎖,可以完全利用多處理器系統。PyPy和CPython都有全域性直譯器鎖。
CPython的執行緒是作業系統的原生執行緒,完全由作業系統排程執行緒的執行。一個CPython直譯器程式內有一個主執行緒以及多個使用者程式的執行執行緒。即使使用多核心CPU平臺,由於全域性直譯器鎖的存在,也將禁止多執行緒的並行執行,這樣會損失許多多執行緒的效能。
在CPython中,全域性直譯器鎖是一個互斥鎖,用於保護對Python物件的訪問,防止多條執行緒同時執行Python位元組碼。這種鎖是必要的,主要是因為CPython的記憶體管理不是執行緒安全的。
在多執行緒環境中,CPython虛擬機器按以下方式執行:
(1)設定全域性直譯器鎖。
(2)切換到一個執行緒中去執行。
(3)執行:
①指定數量的位元組碼指令;
②執行緒主動讓出控制[可以呼叫time.sleep(0)]
(4)把執行緒設定為睡眠狀態。
(5)解鎖全域性直譯器鎖。
(6)再次重複以上所有步驟。
在呼叫外部程式碼(如C/C++擴充套件函式)的時候,全域性直譯器鎖將會被鎖定,直到這個函式結束為止(因為在這期間沒有Python的位元組碼被執行,所以不會做執行緒切換)。

相關文章