Cpython解釋器中的GIL全局解釋器鎖
1、什么是GIL全局解釋器鎖
GIL:Global Interpreter Lock,意思就是全局解釋器鎖,這個GIL并不是Python的特性,他是只在Cpython解釋器里引入的一個概念,而在其他的語言編寫的解釋器里就沒有GIL,例如:Jython,Pypy等
下面是官方給出的解釋:
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
翻譯過來的意思就是:在CPython中,全局解釋器鎖(GIL)是一個互斥鎖,可以防止多個本地線程同時執(zhí)行Python字節(jié)碼。這個鎖是必要的,主要是因為CPython的內(nèi)存管理不是線程安全的。(但是,由于GIL存在,其他特性已經(jīng)發(fā)展到依賴于它所執(zhí)行的保證。)
所以:
GIL本質(zhì)上就是一把互斥鎖,用來保證數(shù)據(jù)的正確性,使數(shù)據(jù)可以正常同步。
GIL就像是BUG一般存在的全局互斥鎖,目前無法通過代碼去除GIL
結(jié)論:在CPython解釋器中,在同一個進(jìn)程下開啟的多線程,同一時刻只能有一個線程執(zhí)行,無法利用多核優(yōu)勢
PS:我們平常所使用的python是C語言編寫的,所以大部分人所說的python也指CPython,CPython是python的官方版本,若是指其他語言寫的python,一般情況下會指明,如Jypthon、Pypy等
2、為什么會出現(xiàn)GIL
隨著電腦多核CPU的出現(xiàn),python為了充分利用多核CPU,進(jìn)行多線程的編程方式便普及了起來,但是隨之而來的困難是線程之間數(shù)據(jù)的一致性和狀態(tài)同步,python為了解決這個數(shù)據(jù)不能同步的問題,所以設(shè)計了GIL全局解釋器鎖,其實就是互斥鎖
說到互斥鎖,在多線程互斥鎖中共享全局變量的時候會有線程對全局變量進(jìn)行的資源競爭,會對全局變量的修改產(chǎn)生不是我們想要的結(jié)果,而那個時候用到的是python中線程模塊里面的互斥鎖。
如下例(未加線程互斥鎖):
from threading import Threadimport time
n = 100
def task():
global n
m = n
time.sleep(0.5) # 模擬IO操作
n = m - 1
if __name__ == '__main__':
list1 = []
for i in range(10):
t = Thread(target=task)
t.start()
list1.append(t)
for t in list1:
t.join()
print(n)
執(zhí)行結(jié)果:
99
在上面的例子里,我創(chuàng)建了10個線程來爭奪對 n 進(jìn)行 -1 操作,但是結(jié)果并非我想要的,所以我在這里加入了互斥鎖
如下例(加線程互斥鎖):
from threading import Thread
from threading import Lock
import time
n = 100
def task(lock):
global n
lock.acquire() # 加鎖
m = n
time.sleep(0.5) # 模擬IO操作
n = m - 1
lock.release() # 解鎖
if __name__ == '__main__':
list1 = []
lock = Lock()
for i in range(10):
t = Thread(target=task, args=(lock, ))
t.start()
list1.append(t)
for t in list1:
t.join()
print(n)
執(zhí)行結(jié)果:
90
這次就可以得到我想要的結(jié)果
3、GIL的優(yōu)缺點
優(yōu)點:
保證數(shù)據(jù)的正確性
缺點:
單個進(jìn)程下,開啟多個線程,犧牲了執(zhí)行效率,無法實現(xiàn)并行,只能實現(xiàn)并發(fā)
4、如何體現(xiàn)GIL全局解釋器鎖
在Cpython解釋器中,當(dāng)python代碼有一個線程開始訪問解釋器的時候,GIL會把這個大鎖給鎖上,此時此刻其他的線程只能干等著,無法對解釋器的資源進(jìn)行訪問,這一點就和互斥鎖相似。而只是這個過程發(fā)生在我們的Cpython中,同時也需要等這個線程分配的時間到了,這個線程把GIL釋放掉,類似互斥鎖的lock.release()一樣,另外其他的線程才開始跑起來。

以上就是Cpython解釋器中的GIL全局解釋器鎖的詳細(xì)內(nèi)容,更多關(guān)于GIL全局解釋器鎖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python編譯成.so文件進(jìn)行加密后調(diào)用的實現(xiàn)
今天小編就為大家分享一篇Python編譯成.so文件進(jìn)行加密后調(diào)用的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python報錯TypeError: ‘NoneType‘ object is
Python實現(xiàn)把utf-8格式的文件轉(zhuǎn)換成gbk格式的文件
python 字符串轉(zhuǎn)列表 list 出現(xiàn)\ufeff的解決方法
Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式

