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