Python GIL 锁 - Python零基础入门教程
目錄
- 一.并行和并發(fā)
- 二.GIL 鎖
- 案例一:單核多線程
- 案例二:單核多線程
- 案例三:雙核多線程
- 三.如何解決 GIL 鎖問題
- 四.猜你喜歡
零基礎(chǔ) Python 學(xué)習(xí)路線推薦 : Python 學(xué)習(xí)目錄 >> Python 基礎(chǔ)入門
Python 中除了線程互斥鎖 Lock 還有 GIL 鎖,GIL 鎖全稱:Global Interpreter Lock,任何 Python 線程 threading 執(zhí)行前,必須先獲得 GIL 鎖才能執(zhí)行,當線程獲取到 GIL 鎖之后,每執(zhí)行 100 條字節(jié)碼,解釋器就自動釋放 GIL 鎖,讓別的線程有機會執(zhí)行。
GIL 全局鎖實際上把所有線程的執(zhí)行代碼都給上了鎖,所以,多線程在 Python 中只能交替執(zhí)行,即使 100 個線程跑在 100 核 CPU 上,也只能用到 1 個核 – 不能有效的利用計算機資源,效率低下,并非真正意義上的多線程;而真正的多線程執(zhí)行時,如果有 100 個線程跑在 100 核 CPU 上,那么就能用到 100 個核 – 充分利用計算機資源,高效率( C 語言 / Java 等等都是如此….)。
?
一.并行和并發(fā)
在 Python 線程 threading 與進程 Process 區(qū)別 的文章中有介紹關(guān)于并行和并發(fā)的簡單講解,在講解 GIL 之前,有必要在補充一下關(guān)于并行和并發(fā)的知識;
并行:多個 CPU 同時執(zhí)行多個任務(wù),就好像有兩個程序,這兩個程序是真的在兩個不同的 CPU 內(nèi)同時被執(zhí)行。
舉個栗子:老王想打麻將,一缺三,分別同時給張三 / 李四 / 王五三位基友打電話,半個小時內(nèi)集合打麻將,張三李四王五接到電話后,立即出發(fā)趕往老王家,張三李四王五的行為就屬于并行;累計耗時:0.5 小時;
并發(fā):CPU 交替處理多個任務(wù),還是有兩個程序,但是只有一個 CPU,會交替處理這兩個程序,而不是同時執(zhí)行,只不過因為 CPU 執(zhí)行的速度過快,而會使得人們感到是在“同時”執(zhí)行,執(zhí)行的先后取決于各個程序?qū)τ跁r間片資源的爭奪。大家可以參考下圖的實物圖就行理解:
舉個栗子:老王想打麻將,一缺三,先給張三打電話,半小時內(nèi)來我家集合打麻將,張三接到電話后立即趕往老王家;張三到了之后老王立即給李四打電話,半小時內(nèi)來我家集合打麻將,李四接到電話后立即趕往老王家;李四到了之后老王立即給王五打電話,半小時內(nèi)來我家集合打麻將,王五接到電話后立即趕往老王家;張三李四王五的行為就屬于并發(fā);累計耗時:1.5 小時;
?
并行和并發(fā)同屬于多任務(wù),目的是要提高 CPU 的使用效率。這里需要注意的是,一個 CPU 永遠不可能實現(xiàn)并行,即一個 CPU 不能同時運行多個程序,但是可以在隨機分配的時間片內(nèi)交替執(zhí)行(并發(fā)),就好像一個人不能同時看兩本書,但是卻能夠先看第一本書半分鐘,再看第二本書半分鐘,這樣來回切換。
二.GIL 鎖
GIL – 也稱鎖全局解釋器鎖(global interpreter lock),每個線程在執(zhí)行時候都需要先獲取 GIL,保證同一時刻只有一個線程可以執(zhí)行代碼,即同一時刻只有一個線程使用 CPU ,也就是說多線程并不是真正意義上的同時執(zhí)行。
案例一:單核多線程
案例二:單核多線程
案例三:雙核多線程
由上所述:由于 GIL 鎖的存在,多線程并不會充分調(diào)用兩個 CPU ,而是會像在一個 CPU 上充分運轉(zhuǎn),而多進程則是會完全調(diào)用兩個 CPU ,同時執(zhí)行;
很多小伙伴可能會疑惑: Python 線程存在 GIL 鎖問題,難道進程 Process 就不存在這個問題嘛?你需要明白:線程共享資源,進程會復(fù)制一份資源,進程與進程之間互不影響!
三.如何解決 GIL 鎖問題
- 1.使用多進程完成多線程的任務(wù)
- 2.在使用多線程可以使用 c 語言去實現(xiàn)
四.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python GIL 鎖
總結(jié)
以上是生活随笔為你收集整理的Python GIL 锁 - Python零基础入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 数组排序 – 冒泡法排序 - C
- 下一篇: Python reload 函数 - P