Python團(tuán)隊(duì)官宣下線GIL:可選擇性關(guān)閉
鵝妹子嚶!拖累AI和ML運(yùn)算的GIL鎖終于關(guān)!閉!了!
Python官方宣布,在新版的CPython中,GIL鎖將成為「可選擇項(xiàng)」。
人們終于不必再受到這一限制的困擾了。
圖片
這則通告中提到的colesbury,多年來一直致力于讓Python官方把GIL移除。
現(xiàn)在這個夢想終于實(shí)現(xiàn)了,不僅Python官方對他表示了感謝,網(wǎng)友也給他發(fā)去了賀電。
圖片
GIL的關(guān)閉,意味著此前只能串行的多個線程將可以并行運(yùn)行。
對于人工智能、機(jī)器學(xué)習(xí)等計算密集型領(lǐng)域,工作效率將大大提高。
聽聞這一消息,已經(jīng)用了20年、快要把Python當(dāng)成母語的老用戶流下了激動的淚水。
圖片
LeCun也發(fā)文表示慶祝:再也沒有GIL了!
圖片
再見了,GIL
根據(jù)官方通告顯示,GIL的下線工作將分為三個階段。
短期之內(nèi),出于兼容性等考量,「無GIL」將作為實(shí)驗(yàn)性功能供用戶選擇。
在這一階段(大約是3.13版本),Python團(tuán)隊(duì)也需要進(jìn)行摸索,可能無法提供社區(qū)支持。
同時官方也希望發(fā)行商在這一階段不要將no-GIL作為默認(rèn)屬性。
這一過程可能持續(xù)1-2年時間。
當(dāng)有足夠的社區(qū)支持能力后,GIL的退出將進(jìn)入中期階段。
這主要取決于修改后的API對舊版本的兼容程度。
這一階段當(dāng)中,分銷商將開始提供no-GIL版本,但不同的包之間可能存在較大差異
而Python團(tuán)隊(duì)的長期目標(biāo)是將no-GIL作為默認(rèn)選項(xiàng),甚至徹底抹去GIL的一切痕跡。
官方對此十分期待,但同時為了確保兼容性,也表示不能操之過急。
官方預(yù)計,這一目標(biāo)可能要等到五年之后實(shí)現(xiàn)。
同時官方也表示,如果在此期間發(fā)現(xiàn)關(guān)閉GIL的風(fēng)險遠(yuǎn)大于收益,會進(jìn)行回滾操作。
不過,也有吃瓜群眾表示,GIL是個嘛玩意兒?
而且這條的瀏覽量在評論區(qū)還排上了第二名。
圖片
那就讓我們來看看,這把「鎖??」,究竟「鎖」住了什么。
GIL「鎖」住了什么
GIL全名為全局解釋器鎖(Global Interpreter Lock)。這是一種線程管理機(jī)制,并不根屬于Python語言,而是存在于CPython中。
Cpython是由官方推出、用C語言實(shí)現(xiàn)的Python代碼解釋器。
換言之,只要用的Python是官方版本,都會受到GIL的影響。
在GIL鎖開啟的情況下,同個進(jìn)程內(nèi)的多個線程只能串行而不能并行。
GIL的釋放有兩種觸發(fā)方式,一種是遇到I/O操作,另一種則是超出時間限制。
遇到I/O操作時,原線程運(yùn)行結(jié)束,其余線程對CPU使用權(quán)進(jìn)行「競爭」。
但如果是超時釋放,原來運(yùn)行的線程會重新加入這場「競爭」。
這種做法是出于安全性考慮,但已經(jīng)不能適應(yīng)時代的發(fā)展。
根據(jù)GIL的原理,主要進(jìn)行I/O操作的程序,比如網(wǎng)頁爬蟲,受到的影響并不大。
而對于計算密集型的程序來說,就是另一回事了。
GIL誕生時的CPU還只有一個核心,但在發(fā)展的過程中,GIL始終保持著全局鎖定的特性。
這就導(dǎo)致了在多核CPU早已普及的今天,多出的核心并沒有被利用,大量算力被浪費(fèi)。
這意味著,對于AI、ML等計算密集領(lǐng)域,效率會出現(xiàn)嚴(yán)重降低。
AI發(fā)展如火如荼的現(xiàn)在,姍姍來遲的解決方案終于出爐。
不過,就像這位網(wǎng)友所說的,晚一些總比沒有好。
參考鏈接:
[1]https://discuss.python.org/t/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython/30474
[2]https://twitter.com/soumithchintala/status/1685524194144989184
[3]https://en.wikipedia.org/wiki/Global_interpreter_lock
[4]https://wiki.python.org/moin/GlobalInterpreterLock