目錄
零基礎(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)
四.猜你喜歡
- Python 條件推導(dǎo)式
- Python 列表推導(dǎo)式
- Python 字典推導(dǎo)式
- Python 不定長參數(shù) *argc/**kargcs
- Python 匿名函數(shù) lambda
- Python return 邏輯判斷表達(dá)式
- Python is 和 == 區(qū)別
- Python 可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型
- Python 淺拷貝和深拷貝
- Python 異常處理
- Python 線程創(chuàng)建和傳參
- Python 線程互斥鎖 Lock
- Python 線程時(shí)間 Event
- Python 線程條件變量 Condition
- Python 線程定時(shí)器 Timer
- Python 線程信號量 Semaphore
- Python 線程障礙對象 Barrier
- Python 線程隊(duì)列 Queue – FIFO
- Python 線程隊(duì)列 LifoQueue – LIFO
- Python 線程優(yōu)先隊(duì)列 PriorityQueue
- Python 線程池 ThreadPoolExecutor(一)
- Python 線程池 ThreadPoolExecutor(二)
- Python 進(jìn)程 Process 模塊
- Python 進(jìn)程 Process 與線程 threading 區(qū)別
- Python 進(jìn)程間通信 Queue / Pipe
未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? Python GIL 鎖
本文由博客 - 猿說編程 猿說編程 發(fā)布!