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