「唉,還沒畢業就受到甲方的支配,等之後進了公司可咋整啊。」小白嘴裏這麼吐槽,但心理上仍是不敢怠慢,只能依依不捨地關掉眼前的遊戲,打開了 Python 代碼思考了起來。python
「如今的程序是單線程的,那就用多線程模型來優化吧,嘿嘿,我太機智了!」小白打心底感謝前段時間裏學習到的線程的知識。「Python 裏好像是 threading
模塊負責多線程的,就決定是你了,threading
!」多線程
花了兩三個小時,小白終於把程序改好了,他長舒一口氣,點擊 Run
,開始測試運行時間。併發
「woc!怎麼運行時間還變長了?」看着屏幕上顯示的測試結果,小白傻眼了,這多線程怎麼不頂用?本身明明是按官方文檔來的啊!學習
debug 無果,小白只好尋求好朋友小明的幫助。測試
「哈哈哈,你竟然用 python 的多線程?你不知道 **python 的多線程被不少人稱做「雞肋」**嗎?」優化
「啊,不會吧?還有這種說法?我要是知道我確定就不用多線程來改了。。。可爲何 python 的多線程就雞肋了?那多線程爬蟲是怎麼回事?」操作系統
「我先給你解釋下 python 下的多線程是怎麼一回事吧。Python 是一門解釋型語言,它的執行是由解釋器來控制的,咱們通常都會使用默認的 Cpython
解釋器,這些我想你應該清楚。」.net
「那固然,這在一開始學 Python 的時候老師就講過了。」線程
「那你知不知道什麼是 GIL?」小明問道。debug
小白撓撓頭,尷尬的回答:「我沒據說過。」
「也是,你要是知道 GIL ,就能弄明白 Python 的多線程了。GIL,全稱是 Global Interpreter Lock
,全局解釋鎖 ,專門給解釋器用的。」
「蛤?解釋器還要須要鎖? 」
「這個鎖別有妙用,讓我先考考你,C 語言能不能在用戶態下作到線程級別的時間片輪轉?」
「不能!操做系統裏講過了,我還記得上次你教個人內容~」小白得意的回答。
關於線程,詳細的在這裏:http://www.javashuo.com/article/p-ztpiosnt-my.html
「可是 python 能作到!python 裏,解釋器能夠記錄每個線程執行了多長時間——時間一到,就可以切換到另外一條線程。」
「有點意思,聽起來像是解釋器充當了操做系統的角色,而後爲 python 線程提供了時間片輪轉的能力。」
tobe 注:理論上 C 語言也能夠作到,畢竟 python 解釋器就是用 C 語言寫的。
「解釋的很到位,我再說回 GIL 吧,在多核尚未出現的時候,就已經有線程的存在了,GIL 就是拿來給線程加鎖的,當一個線程將要執行時,解釋器會把 GIL 鎖給這個線程,其餘線程由於沒有鎖,是沒法運行的。等到持有鎖線程阻塞或者運行 100 個字節碼,解釋器就會把鎖交給其餘線程。」
「可是這個 GIL 鎖是全局(Global)的,也就致使即便是多核狀況下,一次也只有一個線程能運行,從總體上看,整個程序是串行的。」
小白恍然大悟:「怪不得個人程序還變慢了,原來 python 的多線程不只不能利用多核,還由於線程切換拖慢了我程序的執行速度!我想不少人應該都遇到過我這個問題吧,Python 社區爲何不修改這一特性,讓多線程也作到並行呢?」
小明嘆了口氣:「哪有這麼簡單,修改鎖的設計是很難的,我據說 MYSQL 拆分 buffer pool mutex
這個全局鎖花了好多年呢。不過 Python 社區爲此仍是作了很多挽救工做的,好比**在線程睡覺(sleep),等待鏈接的時候主動釋放 GIL,讓其餘線程繼續執行。**拿爬蟲程序來講吧,單個爬蟲總會花時間在下載網頁上,不少 CPU 時間就浪費掉了, 提供 sleep 機制後,這些爬蟲能夠在等待下載時釋放 GIL 鎖,把機會讓給其餘爬蟲,這樣總體運行速度可以獲得大幅提高。」
「我好像明白了,」小白感受本身被打通了任督二脈:「也就是說 Python 的多線程適合 I/O 密集型的程序,可是對計算密集型程序就不那麼友好了~ 誒等等,那我怎麼辦?我還打算用多線程優化個人程序呢!」
「讓 python 利用多核的方法仍是有的,好比說,讓 python 調用 C 語言的代碼,在 C 語言裏實現多線程,由於 C 語言裏沒有 GIL 鎖,這些線程不會受到 GIL 的約束,也就能並行了。」
小白一個勁兒搖頭:「不不不不不,好不容易寫完的 Python 代碼,你讓我改爲 C?這不是要個人命嗎!我拒絕!」
「這不是還有第二種方法嘛——使用多進程,Python 裏有個 multiprocessing
模塊,能夠建立多個進程,由於不一樣的進程使用不一樣的解釋器,因此它們有各自的 GIL,互不干擾,天然就能完成併發了。「
「這個方法聽起來才正常嘛,我立刻就回去試試,謝謝你了!」
但願你在看完個人文章以後有所收穫~(求點贊吶!)
若是本文對你有幫助,歡迎關注個人公衆號 tobe的囈語 ,帶你深刻計算機的世界~ 公衆號後臺回覆關鍵詞【計算機】有驚喜哦~