Grumpy:Google 用 Go 开发的 Python 运行时
tjuyuki
8年前
<p>Google 运行着大量的 Python 代码,油Tube.com 的前端服务器是 Python 写的,油Tube 的 API 主要也是 Python 写的。到了 油Tube 的量级,性能非常重要。油Tube 的前端主要依赖 CPython 2.7,所以 Google 花费了大量精力来优化运行时,并调整应用,以获得最好的性能。</p> <p>了解 CPython 的读者应该都知道,GIL(Global Interpreter Lock)的存在,制约了 Python 应用的并发能力。</p> <p>调研了很多其他 Python 运行时,并没有哪种方案能够在不引入新问题的前提下解决并发问题。</p> <p>Google 的工程师开始思考一个问题,是不是可以开发一个针对实时服务进行优化的新运行时呢?</p> <p>Grumpy 应运而生了。</p> <p>Grumpy 是一个实验性的 Python 运行时。它将 Python 代码翻译成 Go 程序,转译(transpiled)得到的程序可以与 Go 运行时无缝集成。</p> <p>因为 Google 目前有大量的 Python 代码,所以高度兼容 CPython 就非常重要。</p> <p>Grumpy 有两个重要的设计选择。</p> <p>首先,不支持 C 扩展模块。虽然代价是无法利用现有的大量 Python C 扩展,但是优势很明显,就是可以灵活地针对并行负载设计API和对象表示。而且 Grumpy 去掉了 GIL,这就可以利用 Go 的垃圾收集来管理对象生命周期,而不再是依赖引用计数。</p> <p>其次,Grumpy 不是解释器。Grumpy 程序和其他任何 Go 程序一样编译、链接。尽管牺牲了开发和部署的灵活性,但是静态编译时可以进行更多优化。和 Go 代码的互操作也非常强大。Grumpy 程序可以像导入 Python 模块那样导入 Go 包。不支持exec 、 eval 和 compile 等动态特性,Google 的产品中不会使用这些特性,所以这也是可以接受的。</p> <p>按功能分,Grumpy 可以分为 grumpc 、 Grump 运行时和 Grumpy 标准库三块。其中grumpc 负责将 Python 程序转换为 Go 程序。解析 Python 代码,生成 Go 代码。它是用 Python 实现的。</p> <p>只支持 Python 2.7,社区有很多吐槽,不过 Google 的很多代码还是以该版本为主,也是可以理解的。</p> <p>Grumpy 还在开发之中,感兴趣的读者可以在 GitHub 上查阅相关代码。</p> <p> </p> <p>参考资料:</p> <ol> <li> <p>https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html</p> </li> <li> <p>https://github.com/google/grumpy</p> </li> </ol> <p> </p> <p>来自:http://www.infoq.com/cn/news/2017/01/Grumpy-Google-Go-Python</p> <p> </p>