请选择 进入手机版|继续访问电脑版
发新帖

求从 Python 转 Go 的实际经验分享

[复制链接]
10415 31
bookding  新手上路  发表于 2018-1-31 15:41:22 | 显示全部楼层
如果是对 qps,特别是计算性能有要求的话,用 golang 没错。
如果是像 web 开发这种主要是卡在 io 上的话,用 python 也没问题。
开发效率肯定是 python 高毋庸置疑,但是动态语言也对开发者的要求比较高,水平差的写出来的 python 真的是惨不忍睹,虽然也能实现功能,但是总有一天忍不了重构的时候才会知道痛的感觉。
其实说 python 的性能问题有点过时,毕竟实在需要的地方可以上 cython。
不知道有没有人知道 uvloop,这东西用起来感觉和 go 的原生已经差不多了。(当然和 fasthttp 还有差距)
python 最大的坑是绕不开 gil,要吃满 cpu 只能多进程,如果涉及到多进程通信又是另一个大坑。

举报 使用道具

回复
yuchenyang1994  新手上路  发表于 2018-1-31 15:46:58 | 显示全部楼层
@bookding libuv 这种配合 py 虽然性能够好,但是能写好这种异步很难,而 golang 提供了把这种细节隐藏在语言 runtime 里,更有利于大规模开发。

举报 使用道具

回复
bookding  新手上路  发表于 2018-1-31 15:48:42 | 显示全部楼层
@yuchenyang1994 python3 的 async\await 语法已经比原来的 yield 好多了,只要脑子里有异步这回事,写起来其实还好。当然 golang 的 goroutine 还是厉害,尤其像 fasthttp 这种对 goroutine 做了二次优化的,的确要甩 py 几条街。
我觉得倒不是大规模开发就一定不能用 python,对于业务需求变化快的服务,用 py 写的效率可能是用 go 写的三倍,尤其是涉及到复用重构,或者是频繁更改接口数据的情况下(比如前端一天变三次 json 结构)。况且一般 web 业务的瓶颈都在 io,就算用 go 来写也不会有本质性的提升。

举报 使用道具

回复
est  新手上路  发表于 2018-1-31 15:56:09 | 显示全部楼层
golang 可以让性能问题更晚爆发。就吃定了这一点而已。

那种从 cache/db/rpc 里读一个返回值丢到 http response 里的事儿,就应该 golang 来做。

举报 使用道具

回复
beanyoung  新手上路  发表于 2018-1-31 16:02:45 | 显示全部楼层
如果性能瓶颈在数据库,用任何语言写区别都不大。投入精力换语言来提高性能,何不投入精力把业务好好设计一下,岂不是收益更大?

举报 使用道具

回复
l1093178  新手上路  发表于 2018-1-31 16:31:06 | 显示全部楼层
@Muninn 感觉 dep 的设计还是有点不适应,官方文档也还有点欠缺

@drackzy 这倒是,Elixir 国内也很惨(感觉比 Ruby 还惨)

举报 使用道具

回复
yuchenyang1994  新手上路  发表于 2018-1-31 16:34:24 | 显示全部楼层
@bookding 我本身是 python 开发,我真的不觉得 python 开发大型项目相对比 go 有优势,因为这只能是相对来说。动态语言一旦开发到一定程度,你会发现面目全非的业务逻辑,满天乱飞的全局变量,散落一地且毫无抽象的函数,见谁都恐慌的错误处理。要开发大型项目,这就十分依赖单元测试,但是说实话,很多人连基本容易测试的代码都很难写出来,单元测试覆盖率上不去,以后做重构,简直就是灾难。golang 相比 py 好的是他在工程上做了很多妥协,甚至不惜牺牲程序员的好感度, 譬如:令人蛋疼的错误处理, 简洁到没有三元运算符的语法,没有泛型等等。。。说到底,python 是一个非常信任程序员的语言,但工程角度来讲应该是不能相信任何程序员。

举报 使用道具

回复
bookding  新手上路  发表于 2018-1-31 16:39:42 | 显示全部楼层
@yuchenyang1994 哈哈哈,面目全非的业务逻辑我也见过,这个深有感触。动态语言对于程序员自身的要求比较高,如果用 python 的话,代码 review 就更重要一些。
至于说大型项目,我也不知道我做过的项目规模够不够大,但是如果一开始就按微服务来写,控制好每个服务的规模的话,单元测试也就容易做得多了。
不过说实话,我也同意 go 在工程角度上比 python 更有优势,毕竟 python 从一开始诞生的时候也没想到会有今天这样规模的应用。而 golang 从一开始就是按照互联网工程来设计的,比如 channel 这种东西,只有写起来的时候才知道有多方便。

举报 使用道具

回复
yuchenyang1994  新手上路  发表于 2018-1-31 16:40:19 | 显示全部楼层
@bookding 嗯,所以问题来了。一般我们开发过程中,一开始我们用 python 快速实现,快速试错。因为有时候我们甚至不知道我们到底要做什么,能做到什么规模。但是一旦项目稳定了。人都是趋利避害的,基本上就不用 python 了。就比如说 asyncio 吧,是能极大提高并发,说实话做的好的话,并发性能甚至可能比 go 还要高。但目前看,即没有成熟稳定的工业框架,也没有大企业为其背书。况且目前发展水平来看也很难落实到工业应用上(我实在是不想吐槽 sanic )。我觉得 go 值得学,甚至值得转。他不是一门让你写的爽的语言,甚至有时候会让你痛苦的语言。但却是把好用的锤子,干啥都干不好,但绝不会干坏的这种。

举报 使用道具

回复
q397064399  新手上路  发表于 2018-1-31 16:47:01 | 显示全部楼层
都要转了,,为啥不转 Java, 转 go 弥补 python 的那些问题,Java 都很好的解决了,直接上奔驰啊,要骑什么自行车

举报 使用道具

回复
superhan  新手上路  发表于 2018-1-31 16:54:30 | 显示全部楼层
@q397064399 同样的疑问

举报 使用道具

回复
江海志  管理员  发表于 2018-1-31 14:07:21 | 显示全部楼层
很棒

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表