哈嘍大家好,我是咸魚
幾天前有媒體報道稱,經(jīng)過多次辯論,Python 指導(dǎo)委員會打算批準(zhǔn)通過 PEP 703 提案,讓 GIL(全局解釋器)鎖在 CPython 中成為一個可選項
PEP 703 提案主要目標(biāo)是使 GIL 變成可選項,即允許 Python 解釋器在特定情況下不使用GIL
這將允許 Python 在多核處理器上更好地利用并行性,從而提高多線程程序的性能
PEP 703 提案建議新增一個配置項 --disable-gil
,加了這個選項之后就可以關(guān)閉 GIL 鎖,如果想要開啟 GIL 鎖,把 --disable-gil
去掉即可
關(guān)于 PEP 703 提案的具體內(nèi)容有興趣的小伙伴們可以去看一下
PEP 703 提案:https://peps.python.org/pep-0703/
接下來我們來看下外媒的這篇報道吧!
原文:https://www.infoworld.com/article/3704248/python-moves-to-remove-the-gil-and-boost-concurrency.html
譯文如下:
經(jīng)過多次辯論,Python 指導(dǎo)委員會打算批準(zhǔn) PEP 703 提案——”使全局解釋器鎖在 CPython 中可選“
PEP 703 提案是多年來嘗試移除 Python GIL 鎖的最終結(jié)果。GIL 鎖的移除消除了多線程的主要障礙,使得 Python 成為真正的多核語言,并且顯著提高其并行工作負(fù)載的性能
有了 PEP 703 提案,Python 中對多線程和并發(fā)的一流支持離成為現(xiàn)實又近了一步
為什么要移除 GIL ?
在 python 中,其內(nèi)存管理系統(tǒng)通過維護(hù)每個對象的引用數(shù)量來跟蹤對象的使用情況(Python 的引用計數(shù)機(jī)制)
當(dāng)對象的引用計數(shù)減少為 0 時,系統(tǒng)就會刪除該對象
由于 Python 誕生于多處理器系統(tǒng)很少見且多核處理器還未出現(xiàn)的時代,所以這種引用計數(shù)機(jī)制不是線程安全的
相反,Python 通過一次只允許一個線程訪問對象來實現(xiàn)線程安全,這便是 GIL 的目的
這些年來許多項目都嘗試移除 GIL,它們確實能夠使多線程程序運(yùn)行地更快,但代價是降低了單線程程序的性能
鑒于絕大多數(shù) Python 應(yīng)用程序都是單線程,所以這是一個糟糕的權(quán)衡。盡管對 GIL 的改進(jìn)提升了 Pyhton 對多線程應(yīng)用程序的處理,但仍舊是一個嚴(yán)重的瓶頸
Python 的核心開發(fā)人員最終決定從 CPython 中移除 GIL,但前提是它可以在不減慢單線程程序速度的情況下完成
沒了 GIL,Python 該如何運(yùn)行?
當(dāng)前關(guān)于 Python 的無 GIL 版本的提案都提到了使用多種技術(shù)來使引用計數(shù)線程安全,并且維持單線程程序的速度不變或者僅對其產(chǎn)生最小的影響
下面是一些關(guān)于無 GIL 版本的提案:
- Biased reference counting(帶偏見的引用計數(shù))
單個線程訪問的對象的引用計數(shù)與多個線程訪問的對象的引用計數(shù)處理方式不同(單線程的更快一點)
由于大多數(shù)對象只被一個線程訪問,因此對單線程程序的影響被降到最低
- Immortalization(永生)
某些對象(如 None
)永遠(yuǎn)不會被回收,因此不需要跟蹤它們的引用計數(shù)
- Thread-safe memory allocation(線程安全的內(nèi)存分配)
一個新的 CPython 對象內(nèi)存分配系統(tǒng)將使垃圾收集器中的對象跟蹤更容易,并以線程安全的方式分配內(nèi)存
- Deferred reference counting(延遲引用計數(shù))
某些對象(如模塊中的頂級函數(shù))的引用計數(shù)可以安全地延遲。這樣可以節(jié)省時間和資源
- A revised garbage collector(修改后的垃圾收集器)
CPyhton 垃圾收集器清楚循環(huán)對象的引用(比如兩個或多個對象互相引用)
無 GIL構(gòu)建對垃圾收集器做了許多更改,例如刪除用于跟蹤對象的“生成”系統(tǒng)
如何逐步引入無 GIL 的 Python?
實施 PEP 703 是一個長期項目,將會在幾年內(nèi)分成多個階段進(jìn)行。在此期間,CPython 解釋器先過渡到使 no-GIL 版本可選,然后是支持,最后成為標(biāo)準(zhǔn)
為了實現(xiàn)這個目標(biāo),CPython 的開發(fā)者將會為 CPython 添加一個實驗性的 ’no-GIL‘ 構(gòu)建模式,以便大家可以在有或沒有 GIL 的情況下編譯 CPython 的版本
最終,no-GIL 構(gòu)建將成為默認(rèn)值
下面則是相關(guān)的計劃:
1、no-GIL 是可選項
對于 CPython 開發(fā)人員和 Python 社區(qū)來說,no-GIL CPython 的第一個版本將是實驗性
這個實驗階段有幾個目標(biāo):
- 首先讓 Python 社區(qū)的其他成員參與進(jìn)來。對 Python 的任何重大更改都需要更廣泛的Python 社區(qū)的支持。實驗性版本為 Python 用戶提供了一種安全地試驗測試其代碼的方法,并且能夠觀察非線程和線程代碼的行為方式
- 其次讓 Python 發(fā)行版可以選擇(而不是”要求“)提供 no-GIL 的 Python。像 Conda 或WinPython 這樣的 Python 發(fā)行版需要保證與原有的 CPython 兼容。在過渡階段,安裝的時候可以提供常規(guī)或者 no-GIL 版本的 CPython 選項,這將允許 Conda 或WinPython 用戶選擇最適合他們需求的版本
- 最后確定 no-GIL 項目是否值得。如果社區(qū)大規(guī)模嘗試 no-GIL 的構(gòu)建后對結(jié)果不滿意,CPython 核心開發(fā)人員保留退出的權(quán)利。雙重構(gòu)建意味著在短期內(nèi)會增加維護(hù)負(fù)擔(dān),但如果 no-GIL 項目被證明不值得,他們也有退路
2、支持 no-GIL Python
下一階段將提供 no-GIL 構(gòu)建作為 CPython 支持的替代構(gòu)建
用戶可以選擇安裝 no-GIL 或 GIL 版本,其中任何一個版本都是正式支持的 CPython 版本,可以接收錯誤修復(fù)、安全補(bǔ)丁和更新
這個階段的一大目標(biāo)是設(shè)置一個期限,使 no-GIL 成為默認(rèn)值
這可能與其他 Python 功能的棄用和刪除在同一時間線上發(fā)生——至少兩三個版本,也意味著至少兩到三年
3、no-GIL 成為默認(rèn)
最后階段是將 CPython 的 no-GIL 版本作為默認(rèn)版本,并從 CPython 中刪除所有與 GIL 相關(guān)的代碼
”我們不想等待太久“,CPython 核心開發(fā)人員 Thomas Wouters 寫道,“因為擁有兩種通用的構(gòu)建模式可能會給社區(qū)帶來沉重的負(fù)擔(dān)(例如,它可以將測試資源和調(diào)試場景加倍),但我們也不能急于求成。我們認(rèn)為可能需要長達(dá)五年的時間才能達(dá)到這個階段
移除 GIL 的最大挑戰(zhàn)
盡管技術(shù)挑戰(zhàn)令人生畏,但這項計劃的最大挑戰(zhàn)不僅僅是技術(shù)挑戰(zhàn)。更大的問題是如何使 Python 生態(tài)系統(tǒng)的其余部分與這些變化保持一致且確保 no-GIL 的 Python 不會產(chǎn)生比它解決的問題更多的問題
根據(jù) Wouters 的說法,”...適應(yīng)非 GIL 構(gòu)建所需的第三方代碼的任何更改都應(yīng)該只適用于 GIL 構(gòu)建(盡管仍然需要解決與舊 Python 版本的向后兼容性問題)“
如上所述,另一個重大挑戰(zhàn)是”帶領(lǐng)Python社區(qū)的其他成員,” Wouters 說,“……確保我們想要做出的改變,以及我們希望他們做出的改變,是可以接受的
“在我們承諾完全切換到 no-GIL 構(gòu)建之前,我們需要看到社區(qū)對它的支持,” Wouters說?!拔覀儾荒苤皇歉淖兡J(rèn)值,然后期望社區(qū)找出他們需要做些什么來支持它”
Python 社區(qū)在從 Python 2 過渡到 Python 3 的過程中經(jīng)歷了巨大的成長痛苦,因此任何像移除 GIL 這樣的重大更改都必須完全向后兼容
正如 Wouters 所說,“我們不希望再出現(xiàn) Python 3 的情況?!?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-637952.html
不過在危險和挑戰(zhàn)之外,還有一個巨大的回報——Python 最終支持了程序員在 21 世紀(jì)所期望的并行性文章來源地址http://www.zghlxwxcb.cn/news/detail-637952.html
到了這里,關(guān)于GIL 鎖或?qū)⒃?CPython 中成為可選項的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!