跳至內容

全域直譯器鎖

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

全域直譯器鎖(英語:Global Interpreter Lock,縮寫GIL),是電腦程式設計語言直譯器用於同步執行緒的一種機制,它使得任何時刻僅有一個執行緒在執行。[1]即便在多核心處理器上,使用 GIL 的直譯器也只允許同一時間執行一個執行緒。常見的使用 GIL 的直譯器有CPythonRuby 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語言編譯動態連結庫的匯出函式。

參考文獻

  1. ^ GlobalInterpreterLock - Python Wiki. [2018-07-19]. (原始內容存檔於2018-06-23) (英語). 
  2. ^ David Beazley. Inside the Python GIL (PDF). Chicago: Chicago Python User Group. 2009-06-11 [2009-10-07]. (原始內容存檔 (PDF)於2010-12-24).