Google 運行著大量的 Python 代碼,youtube.com 的前端服務器是 Python 寫的,YouTube 的 API 主要也是 Python 寫的。到了 YouTube 的量級,性能非常重要。YouTube 的前端主要依賴 CPython 2.7,所以 Google 花費了大量精力來優化運行時,并調整應用,以獲得最好的性能。
了解 CPython 的讀者應該都知道,GIL(Global Interpreter Lock)的存在,制約了 Python 應用的并發能力。
調研了很多其他 Python 運行時,并沒有哪種方案能夠在不引入新問題的前提下解決并發問題。
Google 的工程師開始思考一個問題,是不是可以開發一個針對實時服務進行優化的新運行時呢?
Grumpy 應運而生了。
Grumpy 是一個實驗性的 Python 運行時。它將 Python 代碼翻譯成 Go 程序,轉譯(transpiled)得到的程序可以與 Go 運行時無縫集成。
因為 Google 目前有大量的 Python 代碼,所以高度兼容 CPython 就非常重要。
Grumpy 有兩個重要的設計選擇。
首先,不支持 C 擴展模塊。雖然代價是無法利用現有的大量 Python C 擴展,但是優勢很明顯,就是可以靈活地針對并行負載設計API和對象表示。而且 Grumpy 去掉了 GIL,這就可以利用 Go 的垃圾收集來管理對象生命周期,而不再是依賴引用計數。
其次,Grumpy 不是解釋器。Grumpy 程序和其他任何 Go 程序一樣編譯、鏈接。盡管犧牲了開發和部署的靈活性,但是靜態編譯時可以進行更多優化。和 Go 代碼的互操作也非常強大。Grumpy 程序可以像導入 Python 模塊那樣導入 Go 包。不支持exec 、 eval 和 compile 等動態特性,Google 的產品中不會使用這些特性,所以這也是可以接受的。
按功能分,Grumpy 可以分為 grumpc 、 Grump 運行時和 Grumpy 標準庫三塊。其中grumpc 負責將 Python 程序轉換為 Go 程序。解析 Python 代碼,生成 Go 代碼。它是用 Python 實現的。
只支持 Python 2.7,社區有很多吐槽,不過 Google 的很多代碼還是以該版本為主,也是可以理解的。
Grumpy 還在開發之中,感興趣的讀者可以在 GitHub 上查閱相關代碼。