「python」——一文讀懂 GIL

GIL:全局解釋器鎖

1. python 的解釋器分為 CPython(默認解釋器)和 JPython,由於歷史原因,在 CPython 上難以移除 GIL

2. 每個線程執行是都需要先獲取 GIL,保證同一時刻只有一個線程可以執行代碼,所以 python 的多線程並不是真正的多線程,不能利用多核的 CPU 資源,但多進程可以利用多核的 CPU 資源。

3. 線程釋放 GIL:在 IO 操作等可能會引起阻塞的 system call 之前,可以暫時釋放 GIL,但在執行完畢之後,必須重新獲取 GIL

4. 多線程並不是雞肋,存在即合理。例如爬蟲時多線程比單線程性能有所提升,因為遇到 IO 阻塞會自動釋放 GIL

5. 避免 GIL:在 python 中可以將核心模塊通過 c/c++ 實現,通過 python 來調用 c/c++,從而能繞開 GIL,讓程序能夠高效運行。

使用 C 語言來解決 GIL 問題

把一個c語言文件編譯成一個動態庫的命令(linux平臺下):

gcc xxx.c -shared -o libxxxx.so

用一個 C 語言實現子線程死循環:

void DeadLoop()
{

while(1)
{
;
}
}

python 實現主線程死循環:

from ctypes import *
from threading import Thread

#加載動態庫
lib = cdll.LoadLibrary("./libloop.so")

#創建一個子線程,讓其執行c語言編寫的函數,此函數是一個死循環
t = Thread(target=lib.DeadLoop)
t.start()

#主線程
while True:
pass


分享到:


相關文章: