Python GIL 鎖 - Python零基礎(chǔ)入門教程

目錄

零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門

Python 中除了線程互斥鎖 Lock 還有 GIL 鎖稼钩,GIL 鎖全稱:Global Interpreter Lock频敛,任何 Python 線程 threading 執(zhí)行前,必須先獲得 GIL 鎖才能執(zhí)行侠驯,當(dāng)線程獲取到 GIL 鎖之后脐恩,每執(zhí)行 100 條字節(jié)碼镐侯,解釋器就自動釋放 GIL 鎖,讓別的線程有機(jī)會執(zhí)行被盈。

GIL 全局鎖實(shí)際上把所有線程的執(zhí)行代碼都給上了鎖析孽,所以,多線程在 Python 中只能交替執(zhí)行只怎,即使 100 個(gè)線程跑在 100 核 CPU 上袜瞬,也只能用到 1 個(gè)核 – 不能有效的利用計(jì)算機(jī)資源,效率低下身堡,并非真正意義上的多線程邓尤;而真正的多線程執(zhí)行時(shí),如果有 100 個(gè)線程跑在 100 核 CPU 上贴谎,那么就能用到 100 個(gè)核 – 充分利用計(jì)算機(jī)資源汞扎,高效率( C 語言 / Java 等等都是如此….)。

一.并行和并發(fā)

Python 線程 threading 與進(jìn)程 Process 區(qū)別 的文章中有介紹關(guān)于并行和并發(fā)的簡單講解擅这,在講解 GIL 之前澈魄,有必要在補(bǔ)充一下關(guān)于并行和并發(fā)的知識;

并行:多個(gè) CPU 同時(shí)執(zhí)行多個(gè)任務(wù)仲翎,就好像有兩個(gè)程序痹扇,這兩個(gè)程序是真的在兩個(gè)不同的 CPU 內(nèi)同時(shí)被執(zhí)行铛漓。

舉個(gè)栗子:老王想打麻將,一缺三鲫构,分別同時(shí)給張三 / 李四 / 王五三位基友打電話浓恶,半個(gè)小時(shí)內(nèi)集合打麻將,張三李四王五接到電話后结笨,立即出發(fā)趕往老王家包晰,張三李四王五的行為就屬于并行;累計(jì)耗時(shí):0.5 小時(shí)炕吸;

并發(fā):CPU 交替處理多個(gè)任務(wù)伐憾,還是有兩個(gè)程序,但是只有一個(gè) CPU赫模,會交替處理這兩個(gè)程序塞耕,而不是同時(shí)執(zhí)行,只不過因?yàn)?CPU 執(zhí)行的速度過快嘴瓤,而會使得人們感到是在“同時(shí)”執(zhí)行扫外,執(zhí)行的先后取決于各個(gè)程序?qū)τ跁r(shí)間片資源的爭奪。大家可以參考下圖的實(shí)物圖就行理解:

舉個(gè)栗子:老王想打麻將廓脆,一缺三筛谚,先給張三打電話,半小時(shí)內(nèi)來我家集合打麻將停忿,張三接到電話后立即趕往老王家驾讲;張三到了之后老王立即給李四打電話,半小時(shí)內(nèi)來我家集合打麻將席赂,李四接到電話后立即趕往老王家吮铭;李四到了之后老王立即給王五打電話,半小時(shí)內(nèi)來我家集合打麻將颅停,王五接到電話后立即趕往老王家谓晌;張三李四王五的行為就屬于并發(fā);累計(jì)耗時(shí):1.5 小時(shí)癞揉;

并行和并發(fā)同屬于多任務(wù)纸肉,目的是要提高 CPU 的使用效率。這里需要注意的是喊熟,一個(gè) CPU 永遠(yuǎn)不可能實(shí)現(xiàn)并行柏肪,即一個(gè) CPU 不能同時(shí)運(yùn)行多個(gè)程序,但是可以在隨機(jī)分配的時(shí)間片內(nèi)交替執(zhí)行(并發(fā))芥牌,就好像一個(gè)人不能同時(shí)看兩本書烦味,但是卻能夠先看第一本書半分鐘,再看第二本書半分鐘壁拉,這樣來回切換谬俄。

二.GIL 鎖

GIL – 也稱鎖全局解釋器鎖(global interpreter lock)岩遗,每個(gè)線程在執(zhí)行時(shí)候都需要先獲取 GIL,保證同一時(shí)刻只有一個(gè)線程可以執(zhí)行代碼凤瘦,即同一時(shí)刻只有一個(gè)線程使用 CPU ,也就是說多線程并不是真正意義上的同時(shí)執(zhí)行案铺。

案例一:單核多線程

案例二:單核多線程

案例三:雙核多線程

由上所述:由于 GIL 鎖的存在蔬芥,多線程并不會充分調(diào)用兩個(gè) CPU ,而是會像在一個(gè) CPU 上充分運(yùn)轉(zhuǎn)控汉,而多進(jìn)程則是會完全調(diào)用兩個(gè) CPU 笔诵,同時(shí)執(zhí)行;

很多小伙伴可能會疑惑: Python 線程存在 GIL 鎖問題姑子,難道進(jìn)程 Process 就不存在這個(gè)問題嘛乎婿?你需要明白:線程共享資源,進(jìn)程會復(fù)制一份資源街佑,進(jìn)程與進(jìn)程之間互不影響谢翎!

三.如何解決 GIL 鎖問題

  • 1.使用多進(jìn)程完成多線程的任務(wù)
  • 2.在使用多線程可以使用 c 語言去實(shí)現(xiàn)

四.猜你喜歡

  1. Python 條件推導(dǎo)式
  2. Python 列表推導(dǎo)式
  3. Python 字典推導(dǎo)式
  4. Python 不定長參數(shù) *argc/**kargcs
  5. Python 匿名函數(shù) lambda
  6. Python return 邏輯判斷表達(dá)式
  7. Python is 和 == 區(qū)別
  8. Python 可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型
  9. Python 淺拷貝和深拷貝
  10. Python 異常處理
  11. Python 線程創(chuàng)建和傳參
  12. Python 線程互斥鎖 Lock
  13. Python 線程時(shí)間 Event
  14. Python 線程條件變量 Condition
  15. Python 線程定時(shí)器 Timer
  16. Python 線程信號量 Semaphore
  17. Python 線程障礙對象 Barrier
  18. Python 線程隊(duì)列 Queue – FIFO
  19. Python 線程隊(duì)列 LifoQueue – LIFO
  20. Python 線程優(yōu)先隊(duì)列 PriorityQueue
  21. Python 線程池 ThreadPoolExecutor(一)
  22. Python 線程池 ThreadPoolExecutor(二)
  23. Python 進(jìn)程 Process 模塊
  24. Python 進(jìn)程 Process 與線程 threading 區(qū)別
  25. Python 進(jìn)程間通信 Queue / Pipe

未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python GIL 鎖

本文由博客 - 猿說編程 猿說編程 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沐旨,一起剝皮案震驚了整個(gè)濱河市森逮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磁携,老刑警劉巖褒侧,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谊迄,居然都是意外死亡闷供,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門统诺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歪脏,“玉大人,你說我怎么就攤上這事粮呢⊥倥矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵鬼贱,是天一觀的道長移怯。 經(jīng)常有香客問我,道長这难,這世上最難降的妖魔是什么舟误? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮姻乓,結(jié)果婚禮上嵌溢,老公的妹妹穿的比我還像新娘夸政。我一直安慰自己,他們只是感情好晕换,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布乡翅。 她就那樣靜靜地躺著,像睡著了一般秧骑。 火紅的嫁衣襯著肌膚如雪版确。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天乎折,我揣著相機(jī)與錄音绒疗,去河邊找鬼。 笑死骂澄,一個(gè)胖子當(dāng)著我的面吹牛吓蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坟冲,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磨镶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了健提?” 一聲冷哼從身側(cè)響起棋嘲,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矩桂,沒想到半個(gè)月后沸移,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侄榴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年雹锣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞蚕。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕊爵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桦山,到底是詐尸還是另有隱情攒射,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布恒水,位于F島的核電站会放,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钉凌。R本人自食惡果不足惜咧最,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矢沿,春花似錦滥搭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至栽惶,卻和暖如春愁溜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背媒役。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宪迟,地道東北人酣衷。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像次泽,于是被迫代替她去往敵國和親穿仪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容