Python中GIL全局解釋鎖的實(shí)現(xiàn)
GIL(Global Interpreter Lock,即全局解釋器鎖)
1.為什么有GIL
設(shè)計(jì)者為了規(guī)避類(lèi)似于內(nèi)存管理這樣的復(fù)雜的競(jìng)爭(zhēng)風(fēng)險(xiǎn)問(wèn)題(race condition)
因?yàn)?CPython 大量使用 C 語(yǔ)言庫(kù),但大部分C語(yǔ)言庫(kù)都不是原生線程安全的(線程安全會(huì)降低性能和增加復(fù)雜度)
2.GIL 是如何工作的
多個(gè)線程執(zhí)行時(shí),每一個(gè)線程在開(kāi)始執(zhí)行時(shí),都會(huì)鎖住 GIL,以阻止別的線程執(zhí)行,同樣的,每一個(gè)線程執(zhí)行完一段后,會(huì)釋放 GIL,以允許別的線程開(kāi)始利用資源
CPython 中還有另一個(gè)機(jī)制,叫做 check_interval, CPython 解釋器會(huì)去輪詢(xún)檢查線程 GIL 的鎖住情況.每隔一段時(shí)間,Python 解釋器就會(huì)強(qiáng)制當(dāng)前線程去釋放 GIL,這樣別的線程才能有執(zhí)行的機(jī)會(huì)
for (;;) {
if (--ticker < 0) {
ticker = check_interval;
/* Give another thread a chance */
PyThread_release_lock(interpreter_lock);
/* Other threads may run now */
PyThread_acquire_lock(interpreter_lock, 1);
}
bytecode = *next_instr++;
switch (bytecode) {
/* execute the next instruction ... */
}
}
3.python的線程安全
有了GIL,任然在編程時(shí)需要考慮線程安全
4.如何如何繞過(guò) GIL?
繞過(guò) CPython,使用 JPython(Java 實(shí)現(xiàn)的Python解釋器)等別的實(shí)現(xiàn)
把關(guān)鍵性能代碼,放到別的語(yǔ)言(一般是 C++)中實(shí)現(xiàn)
5.在處理cpu密集型任務(wù)時(shí),為什么有時(shí)候使用多線程會(huì)比單線程還要慢些?
GIL采用輪流運(yùn)行線程的機(jī)制,GIL需要在線程之間不斷輪流進(jìn)行切換,線程如果多或者運(yùn)行時(shí)間較長(zhǎng),切換帶來(lái)的性能損失可能超過(guò)單線程
6 .你覺(jué)得 GIL 是一個(gè)好的設(shè)計(jì)嗎?
事實(shí)上,在 Python 3 之后,確實(shí)有很多關(guān)于 GIL 改進(jìn)甚至是取消的討論,你的看法是什么呢?你在平常工作中有被 GIL 困擾過(guò)的場(chǎng)景嗎?
GIL任然是一個(gè)好的設(shè)計(jì)雖然損失了性能,但在保證資源不會(huì)沖突和預(yù)防死鎖方面有一定作用
到此這篇關(guān)于Python中GIL全局解釋鎖的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python GIL全局解釋鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的實(shí)例代碼
先前學(xué)習(xí)過(guò),數(shù)字和字符串都可以存儲(chǔ)到變量當(dāng)中,下面這篇文章主要給大家介紹了關(guān)于python中數(shù)字列表轉(zhuǎn)化為數(shù)字字符串的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
出現(xiàn)module 'queue' has no attrib
這篇文章主要介紹了出現(xiàn)module 'queue' has no attribute 'Queue'問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Python基于分析Ajax請(qǐng)求實(shí)現(xiàn)抓取今日頭條街拍圖集功能示例
這篇文章主要介紹了Python基于分析Ajax請(qǐng)求實(shí)現(xiàn)抓取今日頭條街拍圖集功能,涉及Python針對(duì)今日頭條URL請(qǐng)求與json數(shù)據(jù)處理相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Python實(shí)現(xiàn)TXT數(shù)據(jù)轉(zhuǎn)三維矩陣
在數(shù)據(jù)處理和分析中,將文本文件中的數(shù)據(jù)轉(zhuǎn)換為三維矩陣是一個(gè)常見(jiàn)的任務(wù),本文將詳細(xì)介紹如何使用Python實(shí)現(xiàn)這一任務(wù),感興趣的小伙伴可以了解下2024-01-01
基于OpenCV的攝像頭測(cè)距的實(shí)現(xiàn)示例
本文主要介紹了基于OpenCV的攝像頭測(cè)距的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Python實(shí)現(xiàn)GPU加速圖像處理的代碼詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)GPU加速圖像處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
數(shù)據(jù)挖掘之Apriori算法詳解和Python實(shí)現(xiàn)代碼分享
這篇文章主要介紹了數(shù)據(jù)挖掘之Apriori算法詳解和Python實(shí)現(xiàn)代碼分享,本文先是對(duì)Apriori算法做了詳細(xì)介紹,然后給出了Python版實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-11-11

