1. 程式人生 > >多核Python:一個艱難卻有價值的目標

多核Python:一個艱難卻有價值的目標

現在的Python有這麼多方便優秀的特性,可是有一個特性一直遲遲沒有實現:所有基於CPython的直譯器都不能同時在多個CPU核心上並行執行App。

這一直是Python最大的絆腳石,特別是現有的實現方法都非常笨拙。目前,隨著現在處理器的核心數目不斷增長(英特爾最近釋出了24核心的CPU),尋求一個長遠的解決方案變得更加急不可待。

共用一個鎖

事實上,在Python中使用多執行緒是完全可以的——其實用的很多。但是對於CPython來說,不可能的事情是,在多個不同的CPU核心上並行執行不同的執行緒。在CPython的記憶體管理中存在安全隱患,所以直譯器每次只能執行一個執行緒,然後根據需要控制鎖的全域性狀態,在不同的執行緒中切換。

這種鎖的機制——直譯器全域性鎖(the Global Interpreter Lock,GIL)是CPython不支援並行執行緒的根本原因。但是也有一些緩衝的中介軟體,比如,在硬碟上的IOS操作和網路讀取不和GIL繫結,所以可以自由地並行執行他們的執行緒,但是和CPU繫結的執行緒就成問題了。

對於Python程式設計師來說,這就意味著在大型計算任務方面的並行效能的損失。使用Python工作的方便伴隨著多執行緒效能方面的巨大損失,這時,同樣比較方便的其他語言就佔了優勢,比如Google的Go語言

打破一個鎖

隨著時間的推移,人們相出了很多策略來優化多執行緒——但大多都是治標不治本——都沒有從根本上解決GIL的問題。一個標準的方案是,啟動多個CPython例項,然後在這些例項之間共享狀態和資料;每一個例項都獨立地執行在不同的CPU上。但是Jeff Knupp說,

這種方案帶來的收益會因為共享狀態的成本大大損失

C語言擴充套件並不受GIL的限制,所以很多對速度要求很高的庫(比如科學計算庫Numpy)是用C實現的,可以多核多執行緒執行。但是CPython的限制依然存在,如果說避免這個問題最好的方法是使用C擴充套件的話,那麼只會讓更多的程式設計師放棄Python而使用C語言。

PyPy,Python的自舉實現,採用了JIT技術,雖然沒有解決GIL的問題,但是大大提升了程式碼執行的速度。從某種方面講,如果只看速度的話,也差不到哪裡去,但是從根本上講,並沒有解決多執行緒的問題。

最後,GIL在Python 3中得到了優化,有了更好的執行緒切換。但是根本問題依然存在——由於GIL程式還是不能真正地多執行緒並行執行。

沒有GIL?沒有問題

拋開上面這些問題不說,對沒有GIL的、相容現有app的Python的追求從未停止。很多Python的其他實現都完全原離GIL,但是都遭到了效能上的損失。比如,一個執行在JVM之上的Python實現——Jython,使用了JVM的物件跟蹤系統,而不是GIL。IronPython採用了和微軟的CLR相同的策略。但是兩者的效能都很反常。有時候,它們表現的比CPython還慢,有時候不相容外部的C程式碼,所以很多程式並不能正常工作。

Trent Nelson of Continuum Analytics的一個叫PyParallel的專案,是一個“實驗性的,理論證明可行的對多核心CPU並行運算優化的Python 3設計實現。”它並沒有廢棄GIL,但是通過替換async優化了它的引入,所以應用可以使用async來並行運算(就像IO、網路伺服器一樣)。這個專案已經停滯好幾個月了,但是從文件來看,它的開發者對這樣的進度很滿意。最終,他們在CPython中這樣宣佈:“慢點沒什麼,只要方向對了就可以。”

PyPy的創始人有一個長期的專案,這個Python的實現使用了一種叫“軟體記憶體交換(software transactional memory)”(PyPy-STM)的技術。根據PyPy創始人的說法,好處是,“這個專案可以對現有的程式優化,使沒有多執行緒執行的程式可以在多個核心上執行。”

PyPy-STM聽起來像魔法一樣,但是它有兩個缺點。第一,現在這個專案還在開發中,目前只支援2.X。第二,對於單執行緒的程式,效能有所下降。根據Python的創始人範·羅蘇姆規定的條款,任何有關解決GIL的嘗試,都不能降低單執行緒程式執行的速度。所以,這個專案暫時不能被CPython接受。

進步與等待

Python的核心開發者Larry Hastings在PyCon 2016上分享了一些關於解決GIL問題的觀點,Hastings分享了他關於GIL問題的嘗試,並在最後給出了一個沒有GIL的Python實現,但是因為快取問題,效能也不盡人意。

Hastings在最後總結到,你可以刪掉GIL,但是你必須有一種方法來確保每次只有一個執行緒在操作全域性物件——比如,使用一個公有執行緒,讓直譯器來處理狀態的改變。

一個好訊息是,如果CPython修復了GI了的問題,那麼開發者使用Python可以輕鬆地開發多執行緒程式。因為Python的語法在不斷優化,Python 3.5以來,async/await語法使得開發多執行緒程式非常簡單。

現在,關於Python GIL的問題還有很多工作需要做。但是毫無疑問的是,問題的第一個答案將是像PyPy-STM一樣的單獨的Python實現。現在如果想嘗試一下沒有GIL的Python,可以試一下第三方的版本。CPython目前沒有任何反應,期待等待的時間不會太長。

相關推薦

Python一個艱難價值目標

現在的Python有這麼多方便優秀的特性,可是有一個特性一直遲遲沒有實現:所有基於CPython的直譯器都不能同時在多個CPU核心上並行執行App。這一直是Python最大的絆腳石,特別是現有的實現方法都非常笨拙。目前,隨著現在處理器的核心數目不斷增長(英特爾最

Python裝飾器之參裝飾器

In 類型 檢查 import must AI partial wrap pass from inspect import signature def f(a,b,c=1):pass sig = signature(f) sig.parameters 實現一個對被裝飾的

一百python黑客工具,總你需要的

女朋友最近想學黑客,為了幫助她更加快速的入門黑客技術,於是我通宵熬夜整理出一百多條python黑客工具。女票欣喜若狂,一晚上...睡不著。 白把個python黑客工具,總有你要的!!   下面我們就開始吧~小編準備了一份2018年最新的python零基礎系統學習資料,私信小編00

一百python黑客工具,總你需要的

女朋友最近想學黑客,為了幫助她更加快速的入門黑客技術,於是我通宵熬夜整理出一百多條python黑客工具。女票欣喜若狂,一晚上...睡不著。 百把個python黑客工具,總有你要的!!   下面我們就開始吧~ 小編準備了一份2018年最新的python零基礎系統學習資料

華信智原做大學生最價值的職業培訓

隨著“互聯網+”概念的提出,網絡營銷行業近年來異軍突起也成為了行業熱門,各行各業出於企業營運發展需求而滋生的網絡營銷需求也使得網絡營銷師的前景十分可觀。作為IT領域 中相對來說時新且高薪的領域,高級網絡營銷師成為了IT行業的緊缺人才,但也成為了眾多求職人員的熱門選擇。網絡營銷師良好的發展前景。

python學習筆記- day10-【問題 python為什麽python線程不能利用CPU?】

例如 currency 視頻 stat 解碼 核心數 __name__ args 制作 為什麽python的多線程不能利用多核CPU,但是咱們在寫代碼的時候,多線程的確是在並發,而且還比單線程快。 一、python的多線程不能利用多核CPU? 原因: 因為GIL,

CPU上python線程並行的一個假象

llb 使用 發展 重要 multi 定律 依賴 並發 操作 引用鏈接:http://www.cnblogs.com/pengyingh/articles/6586760.html GIL 與 Python 線程的糾葛 GIL 是什麽東西?它對我們的 python 程序會產

解決一個服務器oracle實例一個實例沒啟動,需手動啟動操作指引教程

數據庫實例 操作 root sql art 啟動 切換 正常 服務 操作背景: Centos6.5 一個服務器內 部署了兩個數據庫實例 orcl1 和 orcl2現遇到問題,orcl1運行正常,orcl2鏈接不上(實例未啟動)現需要在不影響orcl1的運行的前提,啟動orc

究極難題 一個執行10秒以上至無窮的呼叫函式,成功後返回值。在工執行緒中怎麼實現呼叫不卡住該執行緒?

究極難題 :一個執行10秒以上至無窮的呼叫函式,成功後有返回值。在多工執行緒中怎麼實現呼叫不卡住該執行緒? Note:一旦呼叫函式,中途無法取消。 思路一:讓其執行在獨立執行緒內。加超時時間。 1. 在超時時間內函式有返回值,則函式執行結束。則獨立執行緒結束。 2. 在超時時

leetcode做題日記【單詞接龍】一個程式設計小菜雞寫出的程式碼能

leetcode第47題:單詞接龍 題幹如下: 單詞接龍 給定兩個單詞(beginWord 和 endWord)和一個字典,找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則: 每次轉換隻能改變一個字母。 轉換過程中的中間單詞

開啟道詞典後提示一個個ActiveX控制元件無法顯示

開啟有道詞典後提示:一個或多個ActiveX控制元件無法顯示,   突然出現這個情況,下載了新的3.4版本以後同樣出現。 win7(64)系統+IE9 現在更新到最新版,還是有這個問題。       &

一個艱難的過程在Mac上安裝python-opencv

搗鼓了一上午才把Opencv在Mac上安裝,併成功在Pycharm中執行。我才不會告訴你我之前就是嫌opencv麻煩,才只用PIL的。。。 言歸正傳,該文章內容參考大量文章才安裝成功。 http://www.pyimagesearch.com/2015/06/15/inst

python類5——Python 的類的下劃線命名什麽不同?

以及 mod 導入 類成員 部分 span 子類 內部函數 默認 首先是單下劃線開頭,這個被常用於模塊中,在一個模塊中以單下劃線開頭的變量和函數被默認當作內部函數,如果使用 from a_module import * 導入時,這部分變量和函數不會被導入。不過值得註意的

Python一個大文件按段落分隔為個小文件的簡單方法

解決 list 之前 一點 open ews 切片 compile popu 今天幫同學處理一點語料。語料文件有點大,而且是以連續兩個換行符作為段落標誌,他想把它按段落分隔成多個小文件。即每3個段落組成一個新文件。因為曾經沒有遇到過類似的操作,在網上找了

一個接口個實現類的調用方式

article 調用 his ace div test 準備 color qualifier 1、普通方式實現: // 定義一個接口 interface Person { void eat(String str); } // 第一個實現類 class Firs

一個應用 可以個application

.com ask html 發出 原則 screen images data- 其它 韓夢飛沙 yue31313 韓亞飛 han_meng_fei_sha [email protected]/* */ 一個應用裏面怎樣才能有2個application

ios上架app希望每一個技術能更好的一份傭金 , 只要有心做你一定能做到更

ios上架app工具之類ios每個9000元起步而後每過一個+500封頂20000元一個,我們不做預付款,請在app通過審核之後聯系我,IOS版本兼容8.0或以上 8.6或以上。我有需求你有技術, q 2305683978 ,D814619026 你可以跟誰都過不去但是你不能跟 money過不去吧 io

使用 pyenv 可以在一個系統中安裝python版本

當前 pypy can 寫入 應該 環境 bash ssl local Installl related yum install readline readline-devel readline-static -y yum install openssl openss

python進程、線程

sts test app 復雜 全局 進行 span 函數 join方法 線程&進程對於操作系統來說,一個任務就是一個進程(Process),比如打開一個瀏覽器就是啟動一個瀏覽器進程,打開一個記事本就啟動了一個記事本進程,打開兩個記事本就啟動了兩個記事本進程,打開一