1. 程式人生 > >python 全局解釋鎖GIL

python 全局解釋鎖GIL

bsp 依賴 兩種 只有一個 但是 使用 解釋 虛擬機 主動

Python的全局解釋器鎖GIL用於保護python解釋器,使得任意時刻,只有一個線程在解釋器中運行。從而保證線程安全

在多線程環境中,Python 虛擬機按以下方式執行: 1. 設置GIL
2. 切換到一個線程去運行
3. 運行:
a. 指定數量的字節碼指令,或者 b. 線程主動讓出控制(可以調用time.sleep(0))
4. 把線程設置為睡眠狀態
5. 解鎖GIL
6. 再次重復以上所有步驟 由上可知,至少有兩種情況python會解鎖GIL,做線程切換:一是一但有IO操作時;線程連續執行了一定數量的指令時;當然此處的線程切換不一定就一定會切換到其他線程執行,因為如果當前線程 優先級比較高的話,可能在讓出鎖以後,又繼續獲得鎖,並優先執行。

由此可以看到,Python多線程是單cpu意義上的多線程,它和多cpu上的多線程有著本質的區別。GIL會影響到那些嚴重依賴CPU的程序(比如計算型的),即使Python的多線程程序並不能利用多核CPU的優勢;

但是如果程序大部分只會設計到I/O,比如網絡交互,那麽使用多線程就很合適, 因為它們大部分時間都在等待。

python 全局解釋鎖GIL