既然python解譯器是單線程的,還有進行多線程編程的必要嗎?
來源:互聯網
上載者:User
寫再多的線程都繞不過解譯器是單線程,那不還等於是單線程? 且線程切換消耗,既然這樣,python還有必要進行多線程編程嗎?
回複內容:
有必要,至少能解決很多IO阻塞問題。
能產生IO阻塞的情況很多,比如網路、磁碟,等等。當發生阻塞時,Python是不耗CPU的,此時如果就一個線程就沒法處理其他事情了。所以對於含有IO阻塞的環境。多線程至少有機會讓你把一個CPU核心跑到100%。
另一個用處來自於Python的C擴充模組。在擴充模組裡是可以釋放GIL的。但釋放GIL期間不應該調用任何Python API。所以,對於一些非常繁重的計算,可以寫成C模組,計算前釋放GIL,計算後重新申請GIL,並將結果返回給Python。這樣就可以讓Python這個進程利用更多的CPU資源。每個Python的線程都是OS層級pthread的線程。利用Python來管理這些線程比在C層級操作pthread更方便。多線程最開始就不是用來解決多核利用率問題的。
是用來解決IO佔用時CPU閑置問題的。
如果你對此有疑問,請複習作業系統相關章節。推薦多進程,多線程不是Python的菜。或者非同步io。多線程可以用來幹解決阻塞問題,可以做事件響應機制(或者類似訊號槽的玩意),如果運行瓶頸不在CPU運算而是在IO(網路)上,多線程顯然很划算。
覺得線程切換開銷大?那協程吧……
覺得GIL不能實質性提高效能?那就多進程吧……
對了,你還可以純C構建模組,模組內的多線程隨便耍,回頭能給python交代就行。那麼單核時代的cpu也是單線程的呀?但是為什麼不能執行多個任務多個線程呢?如果你的任務是多線程的,那麼必須多線程
例如網路通訊,你一邊把自己的話輸進去,一邊收聽別人傳給你的話
那麼至少用兩個線程
至於以最快速度來計算的任務,多線程沒意義
多進程才有意義,可以利用CPU的多核來搞分散式運算,如一個任務切成4個任務,就在4核同時跑計算密集型用多進程,IO密集型用python多線程。當然你足夠牛逼去GIL也可以…基本上很少用到的感覺。。