GIL
GIL稠歉,即全局解釋器鎖(Global Interpreter Lock)掰担,是計算機程序設(shè)計語言解釋器用于同步線程的工具,使得任何時刻僅有一個線程在執(zhí)行怒炸。
Python的GIL
CPython的線程是操作系統(tǒng)的原生線程带饱。在Linux上為pthread,在Windows上為Win thread阅羹,完全由操作系統(tǒng)調(diào)度線程的執(zhí)行勺疼。一個python解釋器進程內(nèi)有一條主線程,以及多條用戶程序的執(zhí)行線程捏鱼。即使在多核CPU平臺上执庐,由于GIL的存在,所以禁止多線程的并行執(zhí)行导梆。
Python解釋器進程內(nèi)的多線程是合作多任務(wù)方式執(zhí)行轨淌。當一個線程遇到I/O任務(wù)時迂烁,將釋放GIL。計算密集型(CPU-bound)的線程在執(zhí)行大約100次解釋器的計步(ticks)時猿诸,將釋放GIL婚被。計步(ticks)可粗略看作Python虛擬機的指令狡忙。計步實際上與時間片長度無關(guān)梳虽。可以通過sys.setcheckinterval()設(shè)置計步長度灾茁。
在單核CPU上窜觉,數(shù)百次的間隔檢查才會導(dǎo)致一次線程切換。在多核CPU上北专,存在嚴重的線程顛簸(thrashing)禀挫。
Python 3.2開始使用新的GIL。在新的GIL實現(xiàn)中拓颓,用一個固定的超時時間來指示當前的線程放棄全局鎖语婴。在當前線程保持這個鎖,且其他線程請求這個鎖的時候驶睦,當前線程就會在5ms后被強制釋放掉這個鎖砰左。
可以創(chuàng)建獨立的進程來實現(xiàn)并行化。Python 2.6引進了multiprocessing這個多進程包场航〔迹或者把關(guān)鍵部分用C/C++寫成 Python 擴展,通過cytpes使Python程序直接調(diào)用C語言編譯的動態(tài)庫的導(dǎo)出函數(shù)溉痢。