GIL(全域性直譯器鎖)
阿新 • • 發佈:2019-02-06
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()