既然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也可以…基本上很少用到的感覺。。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.