全域直譯器鎖
此條目或其章節極大或完全地依賴於某個單一的來源。 (2014年5月7日) |
全域直譯器鎖(英語:Global Interpreter Lock,縮寫GIL),是電腦程式設計語言直譯器用於同步執行緒的一種機制,它使得任何時刻僅有一個執行緒在執行。[1]即便在多核心處理器上,使用 GIL 的直譯器也只允許同一時間執行一個執行緒。常見的使用 GIL 的直譯器有CPython與Ruby MRI。
Python的GIL
- CPython的執行緒是作業系統的原生執行緒。在Linux上為pthread,在Windows上為Win thread,完全由作業系統排程執行緒的執行。一個Python直譯器行程內有一個主執行緒,以及多個使用者程式的執行執行緒。即便使用多核心CPU平台,由於GIL的存在,也將禁止多執行緒的並列執行。[2]
- Python直譯器行程內的多執行緒是以協同運作多工方式執行。當一個執行緒遇到I/O工作時,將釋放GIL。計算密集型(CPU-bound)的執行緒在執行大約100次直譯器的計步(ticks)時,將釋放GIL。計步(ticks)可粗略看作Python虛擬機器的指令。計步實際上與時間片長度無關。可以透過
sys.setcheckinterval()
設定計步長度。 - 在單核CPU上,數百次的間隔檢查才會導致一次執行緒切換。在多核CPU上,存在嚴重的執行緒顛簸(thrashing)。
- Python 3.2開始使用新的GIL。新的GIL實做中用一個固定的逾時時間來指示當前的執行緒放棄全域鎖。在當前執行緒保持這個鎖,且其他執行緒請求這個鎖時,當前執行緒就會在5毫秒後被強制釋放該鎖。
- 可以建立獨立的行程來實做並列化。Python 2.6引進了多行程包multiprocessing。或者將關鍵組件用C/C++編寫為Python擴充,透過ctypes使Python程式直接呼叫C語言編譯的動態連結庫的匯出函式。
參考文獻
- ^ GlobalInterpreterLock - Python Wiki. [2018-07-19]. (原始內容存檔於2018-06-23) (英語).
- ^ David Beazley. Inside the Python GIL (PDF). Chicago: Chicago Python User Group. 2009-06-11 [2009-10-07]. (原始內容存檔 (PDF)於2010-12-24).