精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

最令人頭疼的Python問題

開發 后端
Python中由于使用了全局解釋鎖(GIL)的原因,代碼并不能同時在多核上并發的運行,也就是說,Python的多線程不能并發,很多人會發現使用多線程來改進自己的Python代碼后,程序的運行效率卻下降了。這篇文章對Python中的全局解釋鎖(GIL)進行了介紹。作者認為這是Python中最令人頭疼的問題。

Python中由于使用了全局解釋鎖(GIL)的原因,代碼并不能同時在多核上并發的運行,也就是說,Python的多線程不能并發,很多人會發現使用多線程來改進自己的Python代碼后,程序的運行效率卻下降了。這篇文章對Python中的全局解釋鎖(GIL)進行了介紹。作者認為這是Python中最令人頭疼的問題。

十年多年來,Python 的全局解釋器鎖(GIL)給新手和專家們帶來了巨大的挫折感和好奇心。

[[207057]]

懸而未決的問題

每個領域都會有這么一個問題:它難度大、耗時多,僅僅是嘗試解決這個問題都會讓人震驚。整個社區在很久以前就放棄了這個問題,現在只有少數人在努力試圖解決它。對于初學者來說,解決這樣高難度的問題,會給他帶來足夠的聲譽。計算機科學領域中的 P = NP 就是這樣的問題。如果能用多項式時間復雜度解決這個問題,那簡直就可以改變世界了。Python 中最困難的問題比 P = NP 要容易一些,不過迄今仍然沒有一個滿意的答案,解決這個問題和解決 P = NP 問題一樣具有革命性。正因為如此, Python 社區會有如此多的人關注于這個的問題: “對于全局解釋器鎖(GIL)能做什么?”

Python 的底層

要理解 GIL 的含義,我們需要從 Python 的基礎說起。像 C++ 這樣的語言屬于編譯型語言,顧名思義,該類型語言的代碼輸入到編譯器,由編譯器根據語言的語法進行解析,生成與語言無關的中間表示,***鏈接成由高度優化的機器碼組成的可執行程序。因為編譯器可以獲取全部代碼(或者是一大段相對獨立的代碼),所以編譯器可以對代碼進行深度優化。這使得它可以對不同的語言結構之間的交互進行推理,從而做出更有效的優化。

相反,Python 是解釋型語言。代碼被輸入到解釋器來運行。解釋器在執行之前對代碼一無所知;它只知道 Python 的規則,以及如何在執行過程中動態地應用這些規則。它也有一些優化,但是和編譯型語言的優化完全不同。由于解釋器不能很好地對代碼進行推導,Python 的大部分優化其實是解釋器本身的優化。更快的解釋器自然意味著更快的程序運行速度,而這種優化對開發者來說是免費的。也就是說,解釋器優化后,開發者不用修改 Python 代碼就可以坐享優化帶來的好處。

這是非常重要的一點,這里有必要在強調一下。在同等條件下,Python 程序的運行速度與解釋器的“速度”直接相關相關。無論開發者怎樣優化自己的代碼,程序的執行速度還是受限于解釋器的執行效率。很明顯,這就是為什么做了如此多的工作去優化 Python 解釋器。這大概是離 Python 開發者最近的免費的午餐。

免費午餐結束了

還是沒有結束?摩爾定律告訴了我們硬件提速的時間表,同時,整整一代程序員學會了如何在摩爾定律下編寫代碼。如果程序員寫了比較慢的代碼,最簡單的辦法通常是稍稍等待一下更快的處理器問世即可。事實上,摩爾定律仍然是并且會在很長一段時間內是有效的,不過它生效的方式有了根本的變化。時鐘頻率不會穩定增長到一個高不可攀的速度,取而代之的是通過多核來利用晶體管密度提高帶來的好處。想要程序能夠充分利用新處理器的性能,就必須按照并發方式對代碼進行重寫。

大部分開發者聽到“并發”通常會馬上想到多線程程序。目前,多線程仍是利用多核系統最常見的方式。多線程編程比傳統的“順序”編程要難很多,不過仔細的程序員可以在代碼中充分利用多線程的并發性。既然幾乎所有應用廣泛的現代編程語言都支持多線程編程,語言在多線程方面的實現應該是事后添加上去的。

意外的事實

現在我們來看一下問題的癥結所在。想要利用多核系統,Python 必須支持多線程。作為解釋型語言,Python 的解釋器對多線程的支持必須是既安全又高效的。我們都知道多線程編程帶來的問題。解釋器必須避免不同的線程操作內部共享的數據。同時還要保證用戶線程能完成盡量多的計算。

那么在不同線程同時訪問數據時,怎樣才能保護數據呢?答案是全局解釋器鎖。顧名思義,這是一個加在解釋器上的全局鎖(從互斥量或者類似意義上來看)。這種方式是很安全,但是(對于 Python 初學者來說)這也就意味著:對于任何 Python 程序,不論有多少線程,多少處理器,任何時候都只有一個線程在執行。

許多人都是偶然發現這個事實。網上的討論組和留言板充斥著來自 Python 初學者和專家提出的類似的問題:為什么我全新的多線程 Python 程序運行得比其只有一個線程的時候還要慢?在問這個問題時,許多人還覺得自己像個傻瓜,因為如果程序確實是可并行的,那么兩個線程的程序顯然要比單線程要快。事實上,問及這個問題的次數實在太多了,Python 的專家們已經為它準備了一個標準答案:不要使用多線程,請使用多進程。但這個答案比問題本身更加讓人困惑:難道我不能在 Python 中使用多線程?在 Python 這樣流行的語言中使用多線程究竟是有多糟糕,連專家都建議不要使用。是我哪里沒有搞明白嗎?

很遺憾,并不是。由于 Python 解釋器的設計,使用多線程以提高性能可以算是一個困難的任務。在最壞的情況下,多線程反而會降低(有時很明顯)程序的運行速度。一個計算機科學專業的新生就可以告訴你:當多個線程競爭一個共享資源時將會發生什么。結果通常不理想。很多情況下多線程都能很好地工作,對于解釋器的實現和內核開發人員來說,不要對 Python 多線程性能有太多抱怨可能是他們***的心愿。

現在該怎么辦呢?慌了嗎?

我們現在能做什么呢?難道作為 Python 開發人員的我們要放棄使用多線程來實現并行嗎?為什么 GIL 在某一時刻只允許一個線程在運行呢?在并發訪問時,難道不可以用粒度更細的鎖來保護多個獨立對象?為什么沒有人做過類似的嘗試呢?

這些問題很實用,它們的答案也十分有趣。GIL 為很多對象的訪問提供這保護,比如當前線程狀態和為垃圾回收而用的堆分配對象。這對 Python 語言來說沒什么奇怪的,它需要使用一個 GIL 。這是該實現的一種產物。現在也有不使用 GIL 的 Python 解釋器(和編譯器)。但是對于 CPython 來說,從其產生到現在 GIL 就一直在存在了。

那么為什么我們不拋棄 GIL 呢?許多人也許不知道,1999年的時候,Greg Stein 針對 Python 1.5 提交了一個名為“free threading”的補丁,這個補丁經常被提到卻不怎么被人理解。這個補丁就嘗試了將 GIL 完全移除,并用細粒度的鎖來代替。然而,GIL 移除的代價是單線程程序的執行速度下降,下降的幅度大概有 40%。使用兩個線程可以讓速度有所提升,但是速度的提升并沒有隨著核數的增加而線性增長。由于執行速度的降低,這一補丁沒有被接受了,并且幾乎被人遺忘。

GIL 讓人頭痛,我們還是想點其他辦法吧

盡管“free threading”這個補丁沒有被接受,但是它還是有啟發性意義。它證明了一個關于 Python 解釋器的基本要點:移除 GIL 是非常困難的。比起該補丁發布的時候,現在的解釋器依賴的全局狀態變得更多了,這使得移除 GIL 變得更加困難。值得一提的是,也正是因為這個原因,許多人對移除 GIL 變得更感興趣了。困難的問題通常都很有趣。

但是這可能有點被誤導了。我們假設一下:如果我們有這樣一個神奇的補丁,它其移除了 GIL ,并且沒有使單線程的 Python 代碼性能下降,我們會得到一直想要的東西:一個能并發使用所有處理器的線程 API。現在我們已經獲得了我們希望的,但這確實是件好事嗎?

基于線程的編程是困難的。當一個人覺得自己了解關于線程的一切,總會有一些新問題出現。一些非常知名的語言設計者和研究者站出來反對線程模型,因為在這方面想要得到合理的一致性真的是太難了。就像任何一個寫過多線程應用程序的人可以告訴你的一樣,不管是多線程應用的開發還是調試難度都會是單線程的應用的指數倍。程序員的思維模型往往適應順序執行模型,恰恰與并行執行模型不匹配。GIL 的出現無意中幫助了開發者免于陷入困境。在使用多線程時仍然需要同步原語,GIL 事實上幫助我們保證不同線程之間的數據一致性。

這么說起來 Python 最難的問題似乎有點問錯了問題。Python 專家推薦使用多進程代替多線程是有道理的,而不是想要給 Python 線程實現遮羞。Python 的這種實現方式促使開發者使用更安全也更直觀的方式實現并發模型,同時保留使用多線程進行開發,讓開發者在必要的時候使用。大多數人可能并不清楚什么是***的并行編程模型。但是大多數人都清楚多線程的方式并不是***的并行模型。

不要認為 GIL 是一成不變或者毫無道理的。Antoine Pitrou 在 Python 3.2 中實現了一個新的 GIL ,比較顯著地改進的 Python 解釋器。這是1992年以來,針對 GIL 最主要的一次改進。這個改變非常巨大,很難在這里解釋清楚,但是從高層次來看,舊的 GIL 通過對 Python 指令進行計數來確定何時釋放 GIL。由于 Python 指令和翻譯成的機器指令并非一一對應的關系,這使得單條 Python 指令可能包含大量工作。新的 GIL 用一個固定的超時時間來指示當前的線程釋放鎖。在當前線程持有鎖且第二個線程請求這個鎖的時候,當前線程就會在 5 ms 后被強制釋放這個鎖(這就是說,當前線程每 5 ms 就要檢查其是否需要釋放這個鎖)。在任務可以執行的情況下,這使得預測線程間的切換變得更容易。

然而,這并不是一個***的改進。對于不同類型任務執行過程中 GIL 的作用的研究,David Beazley 可能是最活躍的一個。除了對 Python 3.2 之前的 GIL 研究最深入,他還研究了這個***的 GIL 實現,并且發現了很多有趣的程序方案:在這些方案中,即使是新的 GIL 實現,表現也相當糟糕。他目前仍然通過實踐研究來推動著有關 GIL 的討論,并發布實踐結果。

不管人們對 Python 的 GIL 看法如何,它仍然是 Python 語言里最困難的技術挑戰。想要理解它的實現需要對操作系統設計、多線程編程、C 語言、解釋器設計和 CPython 解釋器的實現有著非常透徹的理解。單是這些前提就妨礙了很多開發者去更徹底地研究 GIL。然而并沒有任何跡象表明 GIL 會在不久之后遠離我們。目前,它將繼續給那些新接觸 Python 并對解決技術難題感興趣的人帶來困惑和驚喜。

以上內容是基于我目前對 Python 解釋器的研究。我打算寫一些關于解釋器其它方面的內容,但是沒有比 GIL 知名度更高的了。雖然這些技術細節來自我對 CPython 代碼庫的徹底研究,但是仍有可能存在不準確的地方。如果你發現了不準確的內容,請及時告知我,我會盡快修正。

責任編輯:未麗燕 來源: 程序師
相關推薦

2010-11-16 09:07:32

2023-04-19 09:05:44

2010-04-08 13:17:39

IT管理系統遷移賽門鐵克

2017-07-14 14:52:25

MySQLAborted告警案例分析

2021-05-09 22:26:36

Python函數變量

2022-05-19 12:14:22

分布式開發框架

2016-09-23 15:17:27

2011-06-20 14:42:45

2009-08-19 11:39:38

ASP.NET Rou

2013-01-23 10:20:48

2020-04-10 14:15:27

Ubuntu 20.0Linux命令

2021-10-09 09:47:14

Java開發 bug

2023-09-07 16:23:22

2019-07-03 15:01:30

戴爾

2017-12-12 13:27:20

主板跳線USB

2017-12-21 04:31:38

物聯網技術趨勢

2010-05-17 17:54:17

微軟蘋果失敗

2020-02-03 17:22:34

垃圾回收原理種類

2010-03-01 13:25:43

2009-04-02 10:23:40

福布斯期待游戲
點贊
收藏

51CTO技術棧公眾號

欧美系列一区| 热久久这里只有精品| 午夜免费一级片| 特级毛片在线| 99re这里都是精品| 日韩免费观看在线观看| 欧美一级特黄高清视频| 日韩精品一区二区三区中文在线 | 中日韩一级黄色片| 亚洲一区二区三区四区电影| 精品久久久久久久久久久久久久| 性欧美大战久久久久久久免费观看 | 欧美三级在线| 亚洲男人天堂九九视频| 亚洲黄色av片| 625成人欧美午夜电影| 国产精品久久久久久久午夜片| 国产精品swag| 国产露脸91国语对白| 国产日韩欧美三区| 久久亚洲私人国产精品va| 中出视频在线观看| 国产精品亚洲欧美一级在线| 色婷婷国产精品综合在线观看| 日本精品免费视频| 男生女生差差差的视频在线观看| 国产一区二区精品久久99| 日韩美女免费视频| 青青草手机在线视频| 成人精品视频| 亚洲美女视频网| 日本人dh亚洲人ⅹxx| 精品裸体bbb| 日韩欧美精品在线观看| 男人的天堂成人| 番号在线播放| 91麻豆国产在线观看| 福利精品视频| www.av在线.com| 极品美女销魂一区二区三区免费| 国产精品福利在线观看| 国产做受高潮漫动| 激情欧美一区| 久久69精品久久久久久久电影好 | 欧美一级性视频| 国产精品资源网站| 国产精品最新在线观看| 91麻豆精品在线| 美女尤物久久精品| 日本免费一区二区三区视频观看 | 91成人免费电影| 欧美日韩在线中文| 国产白丝在线观看| 亚洲成人综合在线| 全黄性性激高免费视频| 欧美v亚洲v| 亚洲在线中文字幕| 青青在线免费观看| 国产www视频在线观看| 一区二区三区欧美在线观看| 四虎免费在线观看视频| 米奇精品一区二区三区| 九九九九九伊人| 熟女俱乐部一区二区视频在线| 精品视频在线一区| 欧美日本韩国一区| 一级片视频免费观看| 欧美123区| 在线视频国产一区| 午夜视频你懂的| 草莓视频成人appios| 欧美伊人久久大香线蕉综合69| 国产a级片免费观看| 毛片免费看不卡网站| 色综合色狠狠综合色| 亚洲国产精品久久久久爰色欲| 在线观看v片| 日韩欧美中文字幕在线观看| 成人综合视频在线| 偷拍视频一区二区三区| 欧美色国产精品| 美女又黄又免费的视频| 成人性生交大片免费看中文视频 | www.av网站| 成人激情综合网站| 欧美精品七区| 麻豆影院在线观看| 亚洲一区二区美女| 国产亚洲天堂网| 黄色精品视频网站| 日韩一区二区三区三四区视频在线观看| 久久久久久久久久久影视| 久久久久久毛片免费看| 最近2019中文字幕大全第二页| h色网站在线观看| 亚洲少妇在线| 成人春色激情网| 免费看黄色一级视频| 久久久精品免费免费| 自拍另类欧美| 手机在线理论片| 欧美福利视频导航| 182在线视频| 日韩av二区| 欧美另类99xxxxx| 丰满人妻老熟妇伦人精品| 老司机免费视频一区二区| 粉嫩精品一区二区三区在线观看| 国产综合在线观看| 一区二区三区鲁丝不卡| 热久久精品国产| 午夜久久av| 亚洲人成在线观看| 欧美激情一区二区视频| 日韩精品三区四区| 国产经典一区二区三区| 欧美一区二区三区在线观看免费| 精品国产91久久久久久| 制服丝袜中文字幕第一页 | 国产a亚洲精品| 亚洲成人av中文字幕| 高清国产在线观看| 中文在线不卡| 国产精品视频免费观看| 久久综合之合合综合久久| 色天使色偷偷av一区二区| 男人添女人荫蒂国产| 日韩在线二区| 国产91色在线| 日韩电影免费| 亚洲精品久久久蜜桃| 亚洲欧美aaa| 欧美综合在线视频观看| 91精品国产91久久久久久吃药 | 成人h精品动漫一区二区三区| 亚洲一区二区三区乱码 | 亚洲r级在线观看| 成年网站在线| 欧洲一区二区三区在线| 玖玖爱在线精品视频| 在线电影一区二区| 成人写真视频福利网| eeuss影院在线观看| 一本色道久久综合亚洲aⅴ蜜桃 | 国产精品三级电影| 成人一级片网站| 色狼人综合干| 26uuu久久噜噜噜噜| 日本波多野结衣在线| 亚洲精选在线视频| 久久久久久久久久久影视| 一级毛片免费高清中文字幕久久网| 国产精品久久97| 欧美91精品久久久久国产性生爱| 五月综合激情婷婷六月色窝| 国产香蕉精品视频| 欧美视频成人| 国产精品一区二区免费| 国内在线视频| 亚洲韩国日本中文字幕| 国产成人免费观看视频| 91捆绑美女网站| 国产麻花豆剧传媒精品mv在线| 自拍欧美一区| 国产精品第1页| 欧美私人网站| 日韩一级黄色大片| 欧美日韩三级在线观看| 丁香婷婷深情五月亚洲| 波多野结衣综合网| 中文字幕中文字幕精品| 国产精品一区二区三区久久久| 日本亚洲精品| 日韩视频在线永久播放| 香蕉免费毛片视频| 久久久精品蜜桃| 九一精品久久久| 欧美日韩少妇| 久久久久久草| 欧美爱爱视频| 欧美肥臀大乳一区二区免费视频| 好吊色一区二区三区| 狠狠躁夜夜躁人人躁婷婷91 | 一区二区久久精品| 欧美不卡一区| 久久久影院一区二区三区| 日本另类视频| 色综合久久88色综合天天看泰| 深爱五月激情五月| 在线观看亚洲成人| 麻豆91精品91久久久| 91性感美女视频| www亚洲成人| 在线精品福利| 偷拍视频一区二区| 亚洲一二三区视频| 国产成人精品综合久久久| 4438x成人网全国最大| 精品91自产拍在线观看一区| 国产性生活视频| 亚洲精品一二三| 欧美做受高潮6| 国产91色综合久久免费分享| av免费网站观看| 综合一区av| 日韩电影免费观看在| av综合网址| 国产欧美va欧美va香蕉在| 成全电影大全在线观看| 综合网日日天干夜夜久久| 亚洲精品久久久狠狠狠爱 | 日本激情综合网| 一本久道综合久久精品| 在线视频不卡国产| 亚洲欧美tv| 国产精品美女xx| 国产精品久久久久久吹潮| 8050国产精品久久久久久| 黄色小网站在线观看| 亚洲人成网在线播放| 人妻视频一区二区三区| 69av一区二区三区| 懂色av蜜臀av粉嫩av喷吹| 午夜精品福利久久久| 国产传媒免费在线观看| 国产欧美精品国产国产专区 | 五月天亚洲色图| 99国精产品一二二线| 国产精品一区二区免费福利视频| …久久精品99久久香蕉国产| 亚洲性图自拍| 久久精品2019中文字幕| 国产精品久久久久一区二区国产| 亚洲国产成人久久| 欧美一级淫片免费视频魅影视频| 91精品国产综合久久久久久漫画 | www国产无套内射com| 日韩a一区二区| 日韩啊v在线| 国产在线日韩精品| 欧美一区二区在线视频| 免费在线不卡视频| 一区二区三区蜜桃| 少妇久久久久久被弄高潮| 国产精品不卡视频| 99自拍偷拍视频| 国产精品网站在线播放| 韩国三级hd中文字幕| 久久美女艺术照精彩视频福利播放| 日韩av无码一区二区三区不卡 | 一本久道久久久| 日韩伦理在线免费观看| 激情综合网址| 日韩欧美一区二| 免费视频一区| 成人在线免费在线观看| 另类av一区二区| 亚洲色欲综合一区二区三区| 六月婷婷一区| 日本熟妇人妻中出| 久久91精品国产91久久小草| 亚洲美女性囗交| 国内精品免费在线观看| 日本亚洲一区二区三区| 丁香婷婷综合激情五月色| 国产 xxxx| 久久影院电视剧免费观看| 97超碰在线免费观看| 国产精品色一区二区三区| 久久精品一区二区三区四区五区| 亚洲美女偷拍久久| 成年人免费看毛片| 一本到高清视频免费精品| 国产精品51麻豆cm传媒| 欧美高清视频不卡网| 亚洲精品免费在线观看视频| 亚洲激情电影中文字幕| 九色视频在线观看免费播放 | 制服丨自拍丨欧美丨动漫丨| 亚洲色图第一区| 久久精品人妻一区二区三区| 欧美午夜久久久| 亚洲网站免费观看| 精品国产一区二区三区av性色| 天堂√在线中文官网在线| 国产一区二区三区毛片| 国产精品久久麻豆| 久久免费国产精品1| 自拍在线观看| 91老司机在线| 欧美午夜18电影| 亚洲伊人婷婷| 亚洲国产精品第一区二区| 不卡影院一区二区| 国产一区91精品张津瑜| 五月婷婷综合在线观看| 亚洲欧美综合在线精品| 日本一区二区免费在线观看| 欧美亚洲综合在线| 嫩草影院一区二区| 色先锋资源久久综合5566| 超碰在线最新网址| 国产精品欧美亚洲777777| 一区二区亚洲视频| 色一情一乱一伦一区二区三区| 国产精品多人| av污在线观看| 99re热这里只有精品视频| 国产传媒免费在线观看| 色老汉一区二区三区| www天堂在线| 日韩在线免费av| 永久免费毛片在线播放| 粉嫩av四季av绯色av第一区| 日韩理论电影院| 日韩a在线播放| 国产成人av电影在线观看| 黑人と日本人の交わりビデオ| 亚洲国产成人91porn| 中文av免费观看| 日韩经典中文字幕| 乱插在线www| 成人黄色免费片| 禁断一区二区三区在线| a在线视频观看| 成人一级片在线观看| 搜索黄色一级片| 欧美日韩国产免费| 黄色片视频在线观看| 欧美在线视频在线播放完整版免费观看| 免费精品一区| 综合网五月天| 久久精品99国产国产精| 精品无人区无码乱码毛片国产| 亚洲电影中文字幕在线观看| www.xxx国产| 欧美成人午夜剧场免费观看| 4438五月综合| 在线丝袜欧美日韩制服| 免费在线成人网| 538精品视频| 在线这里只有精品| 国产爆初菊在线观看免费视频网站| 欧美一区二区三区免费视| 99久久香蕉| av在线观看地址| 成人手机电影网| 久久精品波多野结衣| 精品少妇一区二区三区| 久久99亚洲网美利坚合众国| 18成人在线| 欧美日韩国产高清| 中文字幕亚洲日本| 亚洲国产欧美日韩另类综合| 日韩在线视频观看免费| 97超级碰碰碰久久久| 日韩激情毛片| 日韩精品一区二区三区不卡| 久久久精品tv| wwwwww在线观看| 久久精品欧美视频| 国产一区二区视频在线看| wwwwww欧美| 99精品视频一区二区三区| 五月天综合激情网| 国产亚洲综合久久| 欧美一级做a| 黄色影视在线观看| 成人视屏免费看| 九九精品免费视频| 亚洲最新av网址| 精品中文字幕一区二区三区| 人人妻人人澡人人爽欧美一区| av亚洲精华国产精华精华 | 青青在线视频| 精品久久久久久乱码天堂| 久久午夜av| 欧日韩不卡视频| 精品1区2区在线观看| 涩涩视频在线| 亚洲精品乱码视频| 国产成人在线免费| 日韩中文字幕在线观看视频| 自拍亚洲一区欧美另类| 精品午夜视频| 久在线观看视频| 中文字幕第一区| 亚洲av少妇一区二区在线观看| 97成人精品区在线播放| 日韩三级在线| 在线观看免费视频黄| 欧美在线观看一二区| 丝袜美女在线观看| 日本一区二区三区免费观看| 韩国女主播成人在线| 久久久久久少妇| 久久视频国产精品免费视频在线| 欧美一区自拍| www.亚洲自拍| 日韩欧亚中文在线|