我为什么从 Python 转向 Go 语言
我从2004年开始使用python,在那之前,我使用perl。python语法简洁,支持面向对象,支持异常处理,丰富的第三方代码库,极大地提高了开发效率。在那以后,我一直使用python,开发企业软件,自动化工具,和小网站。
然后在2012年,我加入看图班(kantuban.com)这个创业公司,继续使用python开发互联网产品。我们使用tornado来开发web的前台,以及后台服务。直到我使用tornado开发的后台服务遇上了性能瓶颈。
这是一个缓存加上算法的服务,需要从数据库加载800万条记录到内存中,然后响应客户端请求,在内存中计算出结果返回客户端。这个服务占用2.1G内存,初始化加载数据时间(也就是启动时间)30分钟。服务的平均响应时间在10ms以下。
问题是,python不支持利用多核的cpu,当执行个别耗时任务时,其它的请求被阻塞(在这里非阻塞的编程模式不起作用,因为本身是密集计算,无法把计算任务推到进程之外)。如果依赖启动多个实例来提高负载,则每个实例需要占用2.1G内存,还要考虑进程间的数据同步。结论是,我们需要支持多线程多核的编程语言。如果一开始使用java,也许没有这样被动。
最后,我决定采用go语言。语法简洁类似python,从语言上支持多核(无需写代码创建线程,只需要全局指定并发数),静态语言更节省内存。
我花了一个多月,把代码从python移植到go,基本上可以做到一行python代码对应一行go代码,移植并不困难,go的代码也比较简洁。新的go服务可以同时对外提供thrift和RESTful的接口。所有的努力都是值得的,我在这里对比一下性能。
|
Python 2.6 |
Go 1.0.3 |
加载时间(分钟:秒) |
30:00 |
2:40 |
占用内存 |
2.1G |
700M |
一个典型计算服务耗时 |
120ms |
11ms |
在这里,我们可以看到,在单个cpu内核的环境下,性能提高了10倍,如果cpu有8核,那和python相比,同一台server就可以负载多80倍的用户。同时,内存占用减少到1/3,也就是作为缓存系统,可以多放3倍的数据。提高了性能,减少了资源。
这是一个缓存和计算服务的场景,普通的互联网软件,都会有这样的使用场景,如果你在使用python做同样的事情,请考虑使用go。
今天(2013-5-3),我升级到了Go 1.1rc1版本,之前说到的加载时间2分40秒,进一步提高到了1分50秒,性能令人惊叹。欢迎尝试go语言,共同交流。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。