最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python編程中Python與GIL互斥鎖關(guān)系作用分析

 更新時(shí)間:2021年09月14日 15:53:54   作者:somenzz  
GIL互斥鎖用來保護(hù)Python世界里的對(duì)象,防止同一時(shí)刻多個(gè)線程執(zhí)行Python字節(jié)碼,確保線程安全,但也導(dǎo)致Python線程無法利用多核CPU優(yōu)勢(shì),本文來探討Python將來是否有可能去除GIL

我們知道,在 CPython 中,有一個(gè)全局解釋器鎖,英文叫 global interpreter lock,簡(jiǎn)稱 GIL,是一個(gè)互斥鎖,用來保護(hù) Python 世界里的對(duì)象,防止同一時(shí)刻多個(gè)線程執(zhí)行 Python 的字節(jié)碼,從而確保線程安全,這導(dǎo)致了 Python 的線程無法利用多核 CPU 的優(yōu)勢(shì),因此有人說 Python 的多線程是偽多線程,性能不高,那么 Python 將來有可能去除 GIL 嗎?

要回答這個(gè)問題,先從 GIL 的起源進(jìn)行分析。

GIL 的起源

Python 第一次發(fā)布是在 1991 年,當(dāng)時(shí)的 CPU 都是單核,單核中,多線程主要為了一邊做IO,一邊做 CPU 計(jì)算而設(shè)計(jì)的,Python 編譯器是由 C 語言編寫的,因此也叫 CPython,那時(shí)候很多編程語言沒有自動(dòng)內(nèi)存管理的功能,為了實(shí)現(xiàn)自動(dòng)垃圾回收,Python 為每一個(gè)對(duì)象進(jìn)行了引用計(jì)數(shù),當(dāng)引用計(jì)數(shù)為 0 的時(shí)候說明該對(duì)象可以回收,從而釋放內(nèi)存了,比如:

>>> import sys
>>> data = { 'gzh': 'Python七號(hào)'}
>>> var1 = data
>>> sys.getrefcount(data)
3
>>> 

這里 data 對(duì)象就有 3 個(gè)引用, 一個(gè)是本身,一個(gè)是變量 var1,一個(gè)是 getrefcount 函數(shù)的參數(shù),如果此時(shí)又有一個(gè)線程引用了 data,那么引用計(jì)數(shù)再增加 1,如果某個(gè)線程使用了 data 后運(yùn)行結(jié)束,那么引用計(jì)數(shù)就減少 1,多線程對(duì)同一個(gè)變量「引用計(jì)數(shù)」進(jìn)行修改,就會(huì)遇到 race conditions(競(jìng)爭(zhēng)),為了避免 race conditions,最簡(jiǎn)單有效的辦法就是加一個(gè)互斥鎖。

如果對(duì)每一個(gè)對(duì)象都加鎖,有可能引發(fā)另一個(gè)問題,就是死鎖,而且頻繁的獲取和釋放會(huì)導(dǎo)致性能下降,最簡(jiǎn)單有效的方法就是加一個(gè)解釋器鎖,線程在執(zhí)行任何字節(jié)碼時(shí)都先獲取解釋器鎖,這就避免了死鎖,而且不會(huì)有太多的性能消耗。當(dāng)時(shí) CPU 都是單核,而且這種 GIL 設(shè)計(jì)簡(jiǎn)單,并不會(huì)影響性能,因此一直沿用至今天。GIL 存在最主要的原因,就是因?yàn)?Python 的內(nèi)存管理不是線程安全的,這就是 GIL 產(chǎn)生并存在的主要緣由。

嘗試消除 GIL

CPU 進(jìn)入多核時(shí)代后,可以同時(shí)做多個(gè)計(jì)算任務(wù), GIL 才真正變成問題。在 1999 年,有個(gè)叫 Greg Stein 的大佬基于 Python 1.5 版本消除了 GIL,取代代之的是在可變數(shù)據(jù)結(jié)構(gòu)上加上更細(xì)粒度的鎖,也提交了補(bǔ)丁用于去除對(duì)全局可變對(duì)象的依賴,然后在標(biāo)準(zhǔn)測(cè)試時(shí)表明去除 GIL 后單線程比不去除時(shí)慢了近 2 倍,測(cè)試的機(jī)器還是當(dāng)時(shí)性能最好 Windows 機(jī)器。也就是說除去了 GIL 后,你使用 2 個(gè) CPU 才能獲取比原來 1 個(gè) CPU 稍微好一點(diǎn)的性能,這種提升明顯得不償失,Greg Stein 的嘗試也就失敗告終。

Python 之父 Guido van Rossum 也歡迎社區(qū)的志愿者去嘗試去除 GIL,只要不降低單線程的性能,但他也提到,去掉 GIL 不是一件容易的事。

Python 開發(fā)者郵件列表中也偶爾會(huì)有去除 GIL 的議題,但是以下需求必須滿足:

  • 簡(jiǎn)單。從長(zhǎng)遠(yuǎn)來看該方案必須是可實(shí)施、可維護(hù)的。
  • 并發(fā)。去除 GIL 必須能提升多線程的性能。
  • 速度。去除 GIL 不能降低單線程的性能。
  • 滿足 CPython 的特性。該方案必須支持 CPython 的功能,比如 __del__ 和弱引用。
  • API 的兼容性。該方案應(yīng)與所有現(xiàn)有CPython擴(kuò)展使用的宏在源方面兼容。
  • 及時(shí)銷毀不可達(dá)對(duì)象,回收內(nèi)存。
  • 有序銷毀,比如不可達(dá)對(duì)象 X 引用了 A,那么應(yīng)該在銷毀 A 之前先銷毀 X(有些垃圾回收算法并不能做到這一點(diǎn))。

有些需求不容易被滿足,比如 4,5,7,目前,還沒有人滿足以上需求的同時(shí)去除 GIL 成功的。

積重難返

這些年 Python 實(shí)在太火了,很多優(yōu)秀的庫都是基于 CPython 進(jìn)行編寫的,很多都是 90 年代的 C 擴(kuò)展庫,如果要除去 GIL,那么很多基于 GIL 編寫的 C 擴(kuò)展便無法使用,也就是去了 GIL,Python 生態(tài)有很多擴(kuò)展或三方庫者無法使用。

還有一個(gè)很明顯的例子,Python 解釋器不止有 CPython,還有用 Java 編寫的 Python,.NET 實(shí)現(xiàn)的 IronPython,這些解釋器完全沒有 GIL,可是有多少人為它們編寫擴(kuò)展呢?

Python 之所以如此火爆,與它有著豐富的三方庫開箱即用有著很大的關(guān)系,積重難返,去除 GIL 很困難。

為什么 Python3 一開始時(shí)不去除 GIL

Python3 在最開始時(shí)是有機(jī)會(huì)實(shí)現(xiàn)很多新功能,在此過程中,打破了一些現(xiàn)有的 C 擴(kuò)展,然后需要更新和移植更改以配合 Python 3,這也是 Python3 一開始不被社區(qū)所接受的原因。

與 Python2 相比,刪除 GIL 將使 Python3 在單線程性能方面更慢,而且很多優(yōu)秀的擴(kuò)展將不能再使用,如果真的這樣,可以想象 Python3 不可能有未來,最終的結(jié)果是 Python3 仍然保持有 GIL。

但 Python3 也為現(xiàn)有的 GIL 帶來了重大改進(jìn),在 Python 3.2 版本中,確保了計(jì)算密集型線程和 I/O 密集型線程并存時(shí), I/O 密集型長(zhǎng)期獲取不到 GIL 而無法執(zhí)行的問題,提升了多線程的性能。

最后的話

Python 因?yàn)閮?nèi)存管理不是線程安全的,因此自出生起就自帶 GIL,然后很多擴(kuò)展都是在 GIL 的保護(hù)下編寫的,時(shí)間一長(zhǎng)積重難反,Python3 一開始也因去除 GIL 導(dǎo)致單線程性能下降的問題而保留 GIL,現(xiàn)在已經(jīng)是 Python3.9 版本了,將來 Python 去除 GIL 的可能性微乎其微,換句話說,去除 GIL 的 Python 也就不是我們認(rèn)識(shí)的 Python 了。

不過不必沮喪,GIL 影響的也僅僅是多線程執(zhí)行計(jì)算密集型的任務(wù)罷了,這種場(chǎng)景大多數(shù)程序員都很少遇到,即使有,可以使用多進(jìn)程來避免 GIL 的影響,或者使用其他編程語言實(shí)現(xiàn),任何編程語言或技術(shù)都不是十全十美的,發(fā)揮所長(zhǎng)是最重要的,即使有 GIL,我也不在乎,也會(huì)依然使用 Python。

以上就是Python與GIL互斥鎖關(guān)系分析的詳細(xì)內(nèi)容,更多關(guān)于Python與GIL互斥鎖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 對(duì)python中for、if、while的區(qū)別與比較方法

    對(duì)python中for、if、while的區(qū)別與比較方法

    今天小編就為大家分享一篇對(duì)python中for 、if、 while的區(qū)別與比較方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 關(guān)于numpy數(shù)組軸的使用詳解

    關(guān)于numpy數(shù)組軸的使用詳解

    今天小編就為大家分享一篇關(guān)于numpy數(shù)組軸的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 基于Python實(shí)現(xiàn)簡(jiǎn)易學(xué)生信息管理系統(tǒng)

    基于Python實(shí)現(xiàn)簡(jiǎn)易學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Python中多線程及程序鎖淺析

    Python中多線程及程序鎖淺析

    這篇文章主要介紹了Python中多線程及程序鎖淺析,本文用一個(gè)實(shí)例講解Python的多線程和程序鎖,需要的朋友可以參考下
    2015-01-01
  • python 反向輸出字符串的方法

    python 反向輸出字符串的方法

    今天小編就為大家分享一篇python 反向輸出字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python pip安裝第三方庫實(shí)現(xiàn)過程解析

    Python pip安裝第三方庫實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Python pip安裝第三方庫實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • mat矩陣和npy矩陣實(shí)現(xiàn)互相轉(zhuǎn)換(python和matlab)

    mat矩陣和npy矩陣實(shí)現(xiàn)互相轉(zhuǎn)換(python和matlab)

    這篇文章主要介紹了mat矩陣和npy矩陣實(shí)現(xiàn)互相轉(zhuǎn)換(python和matlab),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 分享3個(gè)簡(jiǎn)單的Python代碼高效運(yùn)行技巧

    分享3個(gè)簡(jiǎn)單的Python代碼高效運(yùn)行技巧

    這篇文章主要介紹了分享3個(gè)簡(jiǎn)單的Python代碼高效運(yùn)行技巧,下面主要分享三個(gè)有效的,方便理解的,執(zhí)行高效的實(shí)用技巧,需要的朋友可以參考一下
    2022-03-03
  • python批量處理txt文件的實(shí)例代碼

    python批量處理txt文件的實(shí)例代碼

    這篇文章主要介紹了python批量處理txt文件的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python日志模塊logging案例詳解

    python日志模塊logging案例詳解

    日志模塊主要用于輸出運(yùn)行日志,可以設(shè)置輸出日志的等級(jí)、日志保存路徑、日志文件回滾等,這篇文章主要介紹了python日志模塊logging,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

麻江县| 衡山县| 台山市| 通山县| 成武县| 洪江市| 宜阳县| 阳江市| 泗洪县| 西丰县| 浑源县| 泽库县| 太仆寺旗| 搜索| 扎囊县| 昭通市| 常德市| 香河县| 商丘市| 和林格尔县| 龙游县| 惠东县| 隆昌县| 旬阳县| 交口县| 崇仁县| 长葛市| 会泽县| 安岳县| 临潭县| 新源县| 青河县| 鹰潭市| 萝北县| 阿拉善右旗| 社会| 吕梁市| 墨竹工卡县| 莎车县| 康保县| 淄博市|