python GIL 全域性直譯器鎖

2021-08-18 01:54:48 字數 1442 閱讀 9535

在vmware虛擬軟體中將ubuntu設定為單核cpu

# 主線程死迴圈,佔滿cpu

while

true:

pass

在vmware虛擬軟體中將ubuntu設定為雙核cpu

import threading

#子執行緒死迴圈

deftest

():while

true:

pass

t1 = threading.thread(target=test)

t1.start()

#主線程死迴圈

while

true:

pass

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

gil 的全程為global interpreter lock ,意即全域性直譯器鎖。

在 python 語言的主流實現 cpython 中,gil 是乙個貨真價實的全域性執行緒鎖,在直譯器解釋執行任何 python **時,都需要先獲得這把鎖才行,在遇到 i/o 操作時會釋放這把鎖。

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

import multiprocessing

defdeadloop

():while

true:

pass

#子程序死迴圈

p1 = multiprocessing.process(target=deadloop)

p1.start()

#主程序死迴圈

deadloop()

loop.c(新建)

void

deadloop

()}

編譯(得到libdead_loop.so)

# 把乙個c語言檔案編譯成乙個動態庫的命令(linux平台下):

# gcc ***.c -shared -o lib***x.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()

python GIL全域性直譯器鎖

什麼是gil python 的執行由python 虛擬機器 也叫直譯器主迴圈,cpython版本 來控制,python 在設計之初就考慮到要在直譯器的主迴圈中,同時只有乙個執行緒在執行,即在任意時刻,只有乙個執行緒在直譯器中執行。對python 虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...

python GIL(全域性直譯器鎖)

cpython直譯器中存在乙個gil 全域性直譯器鎖 他的作用就是保證同一時刻只有乙個執行緒可以執行 因此造成了我們使用多執行緒的時候無法實現並行 每個執行緒在執行的過程都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行 執行緒釋放gil鎖的情況 在io操作等可能會引起阻塞的system cal...

Python GIL(全域性直譯器鎖)

在使用多執行緒的時候,由於使用的是c語言的直譯器,c語言直譯器存在乙個歷史問題,那就是同一時刻只能執行乙個執行緒,這就使得需要不停的來回切換執行緒的,每個執行緒在執行的過程都需要先獲取gil,保證同一時刻只有乙個執行緒可以執行 gil就相當於乙個鎖,當乙個執行緒用時將執行緒鎖上,其他執行緒不能用,在...