回覆列表
  • 1 # 米小樂小米

    其次,要回答這個問題,首先你要了解一個概念——全域性直譯器鎖(GIL)。

    轉一篇關於Python GIL的文章。

    歸納一下,CPU的大規模電路設計基本已經到了物理意義的盡頭,所有廠商們都開始轉向多核以進一步提高效能。Python為了能利用多核多執行緒的的優勢,但又要保證執行緒之間資料完整性和狀態同步,就採用了最簡單的加鎖的方式(所以說Python的GIL是設計之初一時偷懶造成的!)。Python庫的開發者們接受了這個設定,即預設Python是thread-safe,所以開始大量依賴這個特性,無需在實現時考慮額外的記憶體鎖和同步操作。但是GIL的設計有時會顯得笨拙低效,但是此時由於內建庫和第三方庫已經對GIL形成了牢不可破的依賴,想改革GIL反而變得困難了(暈!)。所以目前的現狀就是,Python的多執行緒在多核CPU上,只對於IO密集型計算產生正面效果;而當有至少有一個CPU密集型執行緒存在,那麼多執行緒效率會由於GIL而大幅下降。雖然Python社群也在不斷為此努力改進,但恐怕短時間內不會有改變,所以想規避GIL的,可以使用多程序的multiprocessing或concurrent.futures模組,或者換個Python的解析器。

    所以說,不管python的官方直譯器在將來對這個問題有沒有什麼改進,現在你就可以有一些解決的辦法。

    可以使用一些沒有GIL的Python的解析器有:JPython,IronPython等。

  • 2 # 左響腳

    先說答案,我認為能。python不能利用多核是指因為GIL的存在,多執行緒時無法利用多核,多執行緒變成了雞肋,只在io併發時有點作用。去掉GIL最大的難題是生態相容問題,現在python有很多c實現的庫,cpython的c api以前沒考慮很多問題,導致c寫的庫和cpython實現過度偶合,這樣即使有更快的python實現,如pypy,為了相容那些庫也不得不摸擬cpython的介面,加入鎖和引用計數等,這樣呼叫c實現的庫反而比cpython更慢,而python的官方實現想改內部實現也不行。好在現在己經有人著手解決這個問題,github上有個hpy專案,它重新設計python的c api介面,使c寫的庫和python實現徹底解偶,同時支援多種編譯方式,能相容現有的c api,如果這個專案能完成並被python社群接受,那python你Gil和慢的問題將有可能徹底解決。目前hpy專案還在開發中

  • 中秋節和大豐收的關聯?
  • 湘菜館餐廳用什麼燈好?