1. 程式人生 > >GIL(全域性直譯器鎖)

GIL(全域性直譯器鎖)

1. 單執行緒死迴圈

在VMware虛擬軟體中將Ubuntu設定為單核cpu

# 主執行緒死迴圈,佔滿cpu
while True:
    pass

2. 多執行緒死迴圈

在VMware虛擬軟體中將Ubuntu設定為雙核cpu

import threading

#子執行緒死迴圈
def test():
    while True:
        pass


t1 = threading.Thread(target=test)
t1.start()

#主執行緒死迴圈
while True:
    pass

驚奇的發現:在雙核cpu下,2個執行緒的程式,竟然只佔用到50%,why......?

GIL

GIL 的全程為Global Interpreter Lock ,意即全域性直譯器鎖。

在 Python 語言的主流實現 CPython 中,GIL 是一個貨真價實的全域性執行緒鎖,在直譯器解釋執行任何 Python 程式碼時,都需要先獲得這把鎖才行,在遇到 I/O 操作時會釋放這把鎖。

如果是純計算的程式,沒有 I/O 操作,直譯器會每隔 100 次操作就釋放這把鎖,讓別的執行緒有機會執行

3. GIL的解決方式-多程序死迴圈

import multiprocessing

def deadLoop():
    while True:
        pass

#子程序死迴圈
p1 = multiprocessing.Process(target=deadLoop)
p1.start()

#主程序死迴圈
deadLoop()

4. GIL的解決方式-呼叫其它語言

loop.c(新建)

void DeadLoop()
{
    while(1)
    {
        ;
    }
}

編譯(得到libdead_loop.so)

# 把一個c語言檔案編譯成一個動態庫的命令(linux平臺下):
# gcc xxx.c -shared -o libxxxx.so
gcc loop.c -shared -o libdead_loop.so

main.py(呼叫libdead_loop.so中的函式)

from ctypes import *
from threading import Thread

# 載入動態庫
lib = cdll.LoadLibrary("./libdead_loop.so") # 建立一個子執行緒,讓其執行c語言編寫的函式,此函式是一個死迴圈 t = Thread(target=lib.DeadLoop) t.start() # 主執行緒,也呼叫c語言編寫的那個死迴圈函式 lib.DeadLoop()