Python 的多線程沒什麼用嗎?小編來告訴你吧

昨天小夥伴私信我,瘋狂的吐槽說;這還沒畢業呢,就感覺被社會的壓力壓得喘不過氣來!當時我只能安慰我的小夥伴,沒事,第二學習階段學完,你就會發現,很多知識點慢慢自己就懂了,他給我說了一段這樣的獨白,讓我倍感欣慰!

Python 的多線程沒什麼用嗎?小編來告訴你吧

上圖是他跟老師的對話,他說;“還沒畢業就受到甲方的支配,等以後進了公司可咋整啊。”小白嘴裡這麼吐槽,但是行動還是要行動的,沒辦法,只能乖乖關掉遊戲,打開了 Python 代碼思考了起來。

“現在的程序是單線程的,那就用多線程模型來優化吧,嘿嘿,我太機智了!”小白打心底感謝前段時間裡學習到的線程的知識。我只告訴他,這是必然的,這其實是一個很小的知識點,“Python 裡好像是 threading 模塊負責多線程的,就決定是你了, threading !”

然後他花了兩個多小時,終於把程序改好了,然後點擊 Run ,開始測試運行時間。

然後發現運行時間還變長了?”看著屏幕上顯示的測試結果,頓時懵圈了,跟我說明明是按著官方來操作的,沒辦法,又跟我請教,然後我跟他解釋,python 下的多線程是怎麼一回事。其實,Python 是一門 解釋型語言 ,它的執行是由 解釋器 來控制的,我們一般都會使用默認的

Cpython 解釋器,這些我想你應該清楚。”

“那當然,這在一開始學 Python 的時候老師就講過了。”

“那你知不知道什麼是 GIL ?”我問他。

小白不好意思的回答:“我沒聽說過。”

“也是, 你要是知道 GIL ,就能弄明白 Python 的多線程了 。GIL,全稱是 Global Interpreter Lock ,全局解釋鎖 ,專門 給解釋器用的 。”

“這個鎖別有妙用,讓我先考考你,C 語言能不能 在用戶態下做到線程級別的時間片輪轉 ?”

“不能!操作系統裡講過了,我還記得上次你教我的內容~”小白得意的回答。

關於線程,詳細的在這裡:

“但是 python 能做到!python 裡,解釋器可以記錄每一個線程執行了多長時間——時間一到,就能夠切換到另一條線程。”

“有點意思,聽起來像是 解釋器充當了操作系統的角色,然後為 python 線程提供了時間片輪轉的能力 。”

“解釋的很到位,我再說回 GIL 吧,在多核還沒有出現的時候,就已經有線程的存在了,GIL 就是拿來給線程加鎖的,當一個線程將要執行時,解釋器會把 GIL 鎖給這個線程,其他線程因為沒有鎖,是無法運行的。 等到持有鎖線程阻塞或者運行 100 個字節碼,解釋器就會把鎖交給其他線程 。”

Python 的多線程沒什麼用嗎?小編來告訴你吧

“但是這個 GIL 鎖是 全局(Global) 的,也就導致 即使是多核情況下,一次也只有一個線程能運行,從整體上看,整個程序是串行的 。”

小白恍然大悟:“怪不得我的程序還變慢了,原來 python 的多線程不僅不能利用多核,還因為 線程切換 拖慢了我程序的執行速度!我想很多人應該都遇到過我這個問題吧,Python 社區為什麼不修改這一特性,讓多線程也做到並行呢?”

3.

我嘆了口氣:“哪有這麼簡單,修改鎖的設計是很難的,我聽說 MYSQL 拆分 buffer pool mutex 這個全局鎖花了好多年呢。不過 Python 社區為此還是做了不少挽救工作的,比如 在線程睡覺(sleep),等待連接的時候主動釋放 GIL,讓其他線程繼續執行。 拿爬蟲程序來說吧,單個爬蟲總會花時間在下載網頁上,很多 CPU 時間就浪費掉了, 提供 sleep 機制後,這些爬蟲可以在等待下載時釋放 GIL 鎖,把機會讓給其他爬蟲,這樣整體運行速度能夠得到大幅提升。”

“我好像明白了,”小白感覺自己恍然大悟:“也就是說 Python 的多線程適合 I/O 密集型的程序,但是對計算密集型程序就不那麼友好了 ~

“讓 python 利用多核的方法還是有的,比如說, 讓 python 調用 C 語言的代碼,在 C 語言裡實現多線程 ,因為 C 語言裡沒有 GIL 鎖,這些線程不會受到 GIL 的約束,也就能並行了。”

Python 的多線程沒什麼用嗎?小編來告訴你吧

小白一個勁兒搖頭:“不不不不不,好不容易寫完的 Python 代碼,你讓我改成 C?這不是要我的命嗎!我拒絕!”

“這不是還有第二種方法嘛——使用

多進程 ,Python 裡有個 multiprocessing 模塊,可以創建多個進程, 因為不同的進程使用不同的解釋器,所以它們有各自的 GIL,互不干擾,自然就能完成併發了。 “

“這個方法聽起來才正常嘛,我馬上就回去試試,謝謝你了!”

好了,以上就是小編給大家帶來的全部內容,轉發此文+關注 並私信小編“資料”即可免費領取2019最新python資料和零基礎入門教程,不定期分享乾貨,歡迎初學和進階中的小夥伴!

Python 的多線程沒什麼用嗎?小編來告訴你吧


分享到:


相關文章: