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