在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就相當於乙個鎖,當乙個執行緒用時將執行緒鎖上,其他執行緒不能用,在...