国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

一篇文章快速了解Python的GIL

2020-02-22 22:51:16
字體:
供稿:網(wǎng)友

前言:博主在剛接觸Python的時候時常聽到GIL這個詞,并且發(fā)現(xiàn)這個詞經(jīng)常和Python無法高效的實(shí)現(xiàn)多線程劃上等號。本著不光要知其然,還要知其所以然的研究態(tài)度,博主搜集了各方面的資料,花了一周內(nèi)幾個小時的閑暇時間深入理解了下GIL,并歸納成此文,也希望讀者能通過次本文更好且客觀的理解GIL。

GIL是什么

首先需要明確的一點(diǎn)是GIL并不是Python的特性,它是在實(shí)現(xiàn)Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標(biāo)準(zhǔn),但是可以用不同的編譯器來編譯成可執(zhí)行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執(zhí)行環(huán)境來執(zhí)行。像其中的JPython就沒有GIL。然而因?yàn)镃Python是大部分環(huán)境下默認(rèn)的Python執(zhí)行環(huán)境。所以在很多人的概念里CPython就是Python,也就想當(dāng)然的把GIL歸結(jié)為Python語言的缺陷。所以這里要先明確一點(diǎn):GIL并不是Python的特性,Python完全可以不依賴于GIL。

那么CPython實(shí)現(xiàn)中的GIL又是什么呢?GIL全稱Global Interpreter Lock為了避免誤導(dǎo),我們還是來看一下官方給出的解釋:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

好吧,是不是看上去很糟糕?一個防止多線程并發(fā)執(zhí)行機(jī)器碼的一個Mutex,乍一看就是個BUG般存在的全局鎖嘛!別急,我們下面慢慢的分析。

為什么會有GIL

由于物理上得限制,各CPU廠商在核心頻率上的比賽已經(jīng)被多核所取代。為了更有效的利用多核處理器的性能,就出現(xiàn)了多線程的編程方式,而隨之帶來的就是線程間數(shù)據(jù)一致性和狀態(tài)同步的困難。即使在CPU內(nèi)部的Cache也不例外,為了有效解決多份緩存之間的數(shù)據(jù)同步時各廠商花費(fèi)了不少心思,也不可避免的帶來了一定的性能損失。

Python當(dāng)然也逃不開,為了利用多核,Python開始支持多線程。而解決多線程之間數(shù)據(jù)完整性和狀態(tài)同步的最簡單方法自然就是加鎖。 于是有了GIL這把超級大鎖,而當(dāng)越來越多的代碼庫開發(fā)者接受了這種設(shè)定后,他們開始大量依賴這種特性(即默認(rèn)python內(nèi)部對象是thread-safe的,無需在實(shí)現(xiàn)時考慮額外的內(nèi)存鎖和同步操作)。

慢慢的這種實(shí)現(xiàn)方式被發(fā)現(xiàn)是蛋疼且低效的。但當(dāng)大家試圖去拆分和去除GIL的時候,發(fā)現(xiàn)大量庫代碼開發(fā)者已經(jīng)重度依賴GIL而非常難以去除了。有多難?做個類比,像MySQL這樣的“小項(xiàng)目”為了把Buffer Pool Mutex這把大鎖拆分成各個小鎖也花了從5.5到5.6再到5.7多個大版為期近5年的時間,本且仍在繼續(xù)。MySQL這個背后有公司支持且有固定開發(fā)團(tuán)隊(duì)的產(chǎn)品走的如此艱難,那又更何況Python這樣核心開發(fā)和代碼貢獻(xiàn)者高度社區(qū)化的團(tuán)隊(duì)呢?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 涿鹿县| 闽侯县| 奉新县| 襄樊市| 扬州市| 呈贡县| 华安县| 基隆市| 阆中市| 类乌齐县| 阿鲁科尔沁旗| 微山县| 正镶白旗| 唐河县| 普格县| 望江县| 来凤县| 寿宁县| 汉源县| 东台市| 资中县| 吴忠市| 鹤峰县| 无棣县| 阿坝县| 玛沁县| 嘉义市| 青海省| 曲麻莱县| 台北市| 吴堡县| 梅州市| 方山县| 阿克苏市| 广河县| 白山市| 张北县| 新乡县| 辽中县| 南开区| 饶河县|