Grumpy:Google 用 Go 開發(fā)的 Python 運(yùn)行時

責(zé)任編輯:editor004

作者:臧秀濤

2017-01-12 11:35:09

摘自:INFOQ

Google 運(yùn)行著大量的 Python 代碼,youtube com 的前端服務(wù)器是 Python 寫的,YouTube 的 API 主要也是 Python 寫的。YouTube 的前端主要依賴 CPython 2 7,所以 Google 花費(fèi)了大量精力來優(yōu)化運(yùn)行時,并調(diào)整應(yīng)用,以獲得最好的性能。

Google 運(yùn)行著大量的 Python 代碼,youtube.com 的前端服務(wù)器是 Python 寫的,YouTube 的 API 主要也是 Python 寫的。到了 YouTube 的量級,性能非常重要。YouTube 的前端主要依賴 CPython 2.7,所以 Google 花費(fèi)了大量精力來優(yōu)化運(yùn)行時,并調(diào)整應(yīng)用,以獲得最好的性能。

了解 CPython 的讀者應(yīng)該都知道,GIL(Global Interpreter Lock)的存在,制約了 Python 應(yīng)用的并發(fā)能力。

調(diào)研了很多其他 Python 運(yùn)行時,并沒有哪種方案能夠在不引入新問題的前提下解決并發(fā)問題。

Google 的工程師開始思考一個問題,是不是可以開發(fā)一個針對實(shí)時服務(wù)進(jìn)行優(yōu)化的新運(yùn)行時呢?

Grumpy 應(yīng)運(yùn)而生了。

Grumpy 是一個實(shí)驗(yàn)性的 Python 運(yùn)行時。它將 Python 代碼翻譯成 Go 程序,轉(zhuǎn)譯(transpiled)得到的程序可以與 Go 運(yùn)行時無縫集成。

因?yàn)?Google 目前有大量的 Python 代碼,所以高度兼容 CPython 就非常重要。

Grumpy 有兩個重要的設(shè)計(jì)選擇。

首先,不支持 C 擴(kuò)展模塊。雖然代價是無法利用現(xiàn)有的大量 Python C 擴(kuò)展,但是優(yōu)勢很明顯,就是可以靈活地針對并行負(fù)載設(shè)計(jì)API和對象表示。而且 Grumpy 去掉了 GIL,這就可以利用 Go 的垃圾收集來管理對象生命周期,而不再是依賴引用計(jì)數(shù)。

其次,Grumpy 不是解釋器。Grumpy 程序和其他任何 Go 程序一樣編譯、鏈接。盡管犧牲了開發(fā)和部署的靈活性,但是靜態(tài)編譯時可以進(jìn)行更多優(yōu)化。和 Go 代碼的互操作也非常強(qiáng)大。Grumpy 程序可以像導(dǎo)入 Python 模塊那樣導(dǎo)入 Go 包。不支持exec 、 eval 和 compile 等動態(tài)特性,Google 的產(chǎn)品中不會使用這些特性,所以這也是可以接受的。

按功能分,Grumpy 可以分為 grumpc 、 Grump 運(yùn)行時和 Grumpy 標(biāo)準(zhǔn)庫三塊。其中g(shù)rumpc 負(fù)責(zé)將 Python 程序轉(zhuǎn)換為 Go 程序。解析 Python 代碼,生成 Go 代碼。它是用 Python 實(shí)現(xiàn)的。

只支持 Python 2.7,社區(qū)有很多吐槽,不過 Google 的很多代碼還是以該版本為主,也是可以理解的。

Grumpy 還在開發(fā)之中,感興趣的讀者可以在 GitHub 上查閱相關(guān)代碼。

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號