在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  Linux/ python 的GIL 和線程鎖的關(guān)系

python 的GIL 和線程鎖的關(guān)系

Python代碼的執(zhí)行由Python 虛擬機(jī)(也叫解釋器主循環(huán),CPython版本)來控制,Python 在設(shè)計(jì)之初就考慮到要在解釋器的主循環(huán)中,同時(shí)只有一個(gè)線程在執(zhí)行,即在任意時(shí)刻,只有一個(gè)線程在解釋器中運(yùn)行。對Python 虛擬機(jī)的訪問由全局解釋器鎖(GIL)來控制,正是這個(gè)鎖能保證同一時(shí)刻只有一個(gè)線程在運(yùn)行。
在多線程環(huán)境中,Python 虛擬機(jī)按以下方式執(zhí)行:
1. 設(shè)置GIL
2. 切換到一個(gè)線程去運(yùn)行
3. 運(yùn)行:
    a. 指定數(shù)量的字節(jié)碼指令,或者
    b. 線程主動(dòng)讓出控制(可以調(diào)用time.sleep(0))
4. 把線程設(shè)置為睡眠狀態(tài)
5. 解鎖GIL
6. 再次重復(fù)以上所有步驟

在調(diào)用外部代碼(如C/C++擴(kuò)展函數(shù))的時(shí)候,GIL 將會(huì)被鎖定,直到這個(gè)函數(shù)結(jié)束為止(由于在這期間沒有Python 的字節(jié)碼被運(yùn)行,所以不會(huì)做線程切換)。

這里主要有2個(gè)問題
1.python 里面的GIl是全局鎖,然后這個(gè)是控制線程的?每個(gè)時(shí)刻只能一個(gè)線程,為啥線程還要上鎖防止競爭呢?這不是矛盾嗎?我有點(diǎn)不太理解,因?yàn)檫@塊我看過很多文章了

2.怎么判斷python里面字節(jié)碼的執(zhí)行過程,我的理解就是一些運(yùn)算操作指令需要字節(jié)碼

謝謝!

回答
編輯回答
巫婆

CPython將代碼翻譯為python虛擬機(jī)指令。線程從指令集中獲取指令去執(zhí)行。GIL的全局鎖保證了同一時(shí)刻最多只能有一個(gè)線程去指令集獲取指令。為啥線程還要上鎖防止競爭呢? 這是因?yàn)镃Python本身并不是線程安全的,也涉及到垃圾回收的??赡芤粋€(gè)我們認(rèn)為一個(gè)動(dòng)作可能需要多個(gè)指令去完成的, a = {} 在可能要 4~5 個(gè)指令來完成這個(gè)動(dòng)作。

關(guān)于多線程的GIL問題,可以看看這篇關(guān)于源碼上的分析:https://www.hongweipeng.com/i...

python里面字節(jié)碼的執(zhí)行過程問題里寫的虛擬機(jī)運(yùn)行方式是正確的,關(guān)于字節(jié)碼和執(zhí)行過程可以看看:https://www.hongweipeng.com/i... 這是對于一般表達(dá)式的字節(jié)碼和其執(zhí)行過程。

2017年8月28日 15:45