全域直譯器鎖
此條目或其章節極大或完全地依賴於某個單一的來源。 (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).