去掉雀斑方法 為什么python的GIL問題一直讓人詬病,python社區(qū)卻不解決?
為什么python的GIL問題一直讓人詬病,python社區(qū)卻不解決?吉爾,這把大鎖,今天仍然存在。這是有道理的。首先,我們知道Python是一種解釋性語言,代碼執(zhí)行是在解釋器中執(zhí)行的。解釋性語言不能
為什么python的GIL問題一直讓人詬病,python社區(qū)卻不解決?
吉爾,這把大鎖,今天仍然存在。這是有道理的。首先,我們知道Python是一種解釋性語言,代碼執(zhí)行是在解釋器中執(zhí)行的。解釋性語言不能實(shí)現(xiàn)真正的多線程并發(fā)是一個(gè)常見的問題。這是先天的。多個(gè)線程共享主進(jìn)程資源。如果線程沒有被鎖定,線程是并發(fā)的,并且多個(gè)線程修改共享數(shù)據(jù),就會(huì)導(dǎo)致數(shù)據(jù)混淆,這是不可靠的。因?yàn)榻忉屍鞑恢涝谀睦镄薷拇a中的共享數(shù)據(jù),所以它直接鎖定線程。解釋器一次只允許運(yùn)行一個(gè)線程。
當(dāng)然,您可能會(huì)說,我只要求解釋器鎖定要修改的共享數(shù)據(jù),這樣多線程就可以真正并行了?事實(shí)上,一個(gè)大老板在國外做這件事已經(jīng)很久了。測試結(jié)果表明,執(zhí)行效率不如直接鎖定線程。到目前為止,python開發(fā)團(tuán)隊(duì)還沒有針對(duì)這個(gè)問題提出更好的解決方案。這是解釋性語言的通病。另外,這個(gè)問題很難解決。
雖然Gil大鎖的存在影響了多線程,不能實(shí)現(xiàn)真正的并發(fā),但我們可以用多進(jìn)程來解決。
Python不能利用多核的問題以后能被解決嗎?
首先,糾正你在問題中所說的話。并不是Python不能使用多核,而是多核的利用效率很低。
其次,要回答這個(gè)問題,您需要理解一個(gè)概念-全局解釋器鎖(GIL)。
看一篇關(guān)于Python Gil的文章。
綜上所述,CPU的大規(guī)模電路設(shè)計(jì)已基本達(dá)到物理意義的末端,各廠商已開始轉(zhuǎn)向多核進(jìn)一步提高性能。為了充分利用多核、多線程的優(yōu)勢,同時(shí)也為了保證線程間的數(shù)據(jù)完整性和狀態(tài)同步,python采用了最簡單的鎖方式(因此python的Gil是設(shè)計(jì)之初的懶惰造成的?。?。Python庫的開發(fā)人員接受了這個(gè)設(shè)置,也就是說,默認(rèn)的Python是線程安全的,所以他們開始嚴(yán)重依賴這個(gè)特性,而不考慮額外的內(nèi)存鎖和同步操作。然而,Gil的設(shè)計(jì)有時(shí)顯得笨拙和低效。此時(shí),由于內(nèi)建圖書館和第三方圖書館對(duì)Gil形成了牢不可破的依賴,Gil的改革難度加大。因此,目前的情況是Python在多核CPU上的多線程只對(duì)Io密集型計(jì)算有積極的影響;當(dāng)至少有一個(gè)CPU密集型線程時(shí),由于Gil的存在,多線程的效率會(huì)大大降低。盡管python社區(qū)正在不斷努力改進(jìn)這一點(diǎn),但我擔(dān)心它不會(huì)在短時(shí)間內(nèi)改變,因此如果您想避免Gil,可以使用多處理器或期貨模塊或python解析器。
所以,不管Python的官方解釋器將來在這個(gè)問題上是否有任何改進(jìn),現(xiàn)在您都可以有一些解決方案了。
您可以使用一些沒有Gil的Python解析器,例如jpython、ironpython等
希望我的答案能幫助您。