自己干什么从python转向go

恩看了那篇本人干什么从python转向go,看来小编也是
KSO
轻办公/公司快盘团队的。作为快盘从无到有一时的工程师之一(总是被潇洒哥说他俩改我留下的
bug ),又刚好是 Python/Go 双修(灰霾其实自己是 Rust
党),其实一起初自我是不容的,duang duang duang,那就顺手写一些把。

作者 CMGS 2015.05.17
15:47*

一段段来呢,首先作者说 Python 是动态语言

写了7891字,被143人关注,获得了97个喜欢

python是一门动态语言,不是强类型系统。对于一个变量,我们有时候压根不知晓它是怎么样类型,然后就可能出现int

  • string那样的运作时不当。

在python里面,可以允许同名函数的产出,后一个函数会覆盖前一个函数,有一次我们系统一个很严重的一无所能就是因为这一个导致的。

字数3748 阅读24227 评论21 喜欢81

其实,如若是静态检查,pylint 和 pyflakes 是足以做那件事的,即使不可能和
go
那种静态编译型语言比,但也足够了。假若没记错的话,阿通当年是要求全组都在提交前做静态检查的。我以为这种难点越来越多的相应是人士素质上来防止,毕竟葱头也说过,代码自己写的即将多回头看看,看能无法重构,能无法做更好。不是说偷懒不行,不过从中得出
Python 动态特性太灵敏,Python:怪我咯?

恩看了那篇本身为何从python转向go,看来小编也是
KSO
轻办公/集团快盘团队的。作为快盘从无到有时代的工程师之一(总是被潇洒哥说她们改我留给的
bug ),又刚刚是 Python/Go 双修(大雾其实自己是 Rust
党),其实一早先自我是不容的,duang duang duang,那就随手写一些把。

其它,函数作为第一对象,在 Python 中是 feature,Go 要写个
mock,几乎虐得不要不要的。

一段段来吧,首先小编说 Python 是动态语言

事实上那么些平素是过多少人吐槽python的地点,可是想想,python最开端是为领悟决吗难点而被支付出来的?我们就是要将他用到高品质服务器开发方面,其实也是有点难为它。

python是一门动态语言,不是强类型系统。对于一个变量,大家有时候压根不亮堂它是何等类型,然后就可能出现int

  • string那样的运行时不当。

在python里面,可以允许同名函数的产出,后一个函数会覆盖前一个函数,有一回大家系统一个很要紧的谬误就是因为这些导致的。

如果没记错,无论是轻办公或者快盘,是重 IO 不重
CPU,最大耗时是数码块加密那块,我在的时候是 Java
写的。别的高品质服务器选 Go 也是虐得不要不要的,各样小心翼翼防止GC。大部分不过情状下,pypy 的性质足矣胜任了,我以为那不算丰硕规范。

实质上,如果是静态检查,pylint 和 pyflakes 是可以做那件事的,纵然不可能和
go
那种静态编译型语言比,但也丰盛了。假使没记错的话,阿通当年是必要全组都在交付前做静态检查的。我以为那种题材更多的相应是人士素质上来避免,毕竟葱头也说过,代码自己写的即将多回头看看,看能无法重构,能无法做更好。不是说偷懒不行,可是从中得出
Python 动态特性太灵活,Python:怪我咯?

python的GIL导致导致不可以真正的二十多线程,大家莫不会说自家用多进度不就完了。但假使有的计量须要涉及到多进度并行,进度之间的报纸揭橥支出也是只可以考虑的。

除此以外,函数作为第一对象,在 Python 中是 feature,Go 要写个
mock,大约虐得不要不要的。

其实,Python 有宏可以绕开这些GIL,可是呢架构设计得好其实可避防止的,到异步那块我会说。

实质上那一个一贯是很多少人吐槽python的地点,但是想想,python最开端是为了缓解什么难题而被支付出来的?大家就是要将他用到高质量服务器开发方面,其实也是有点难为它。

无状态的分布式处理利用多进度很方便,譬如处理http请求,大家就是在nginx前面挂载了200四个django
server来处理http的,但如此四个进度自然导致全体机器负载偏高。

但尽管咱们使用了多少个django进度来拍卖http请求,对于有些超大批量请求,python照旧处理然而来。所以我们利用openresty,将高频次的http请求使用lua来贯彻。可这么又导致使用二种开发语言,而且有些逻辑还得写两份不相同的代码。

万一没记错,无论是轻办公或者快盘,是重 IO 不重
CPU,最大耗时是数额块加密那块,我在的时候是 Java
写的。此外高质量服务器选 Go 也是虐得不要不要的,种种小心翼翼避免GC。半数以上极致气象下,pypy 的习性足矣胜任了,我觉得那不算丰裕规范。

即使臆想没错,你们现在还在用五年前写的 Gateway?那些基于 django route
的流量分发层?四年前自己离开的时候已经小范围的运用 Flask+Gevent Demo
测试过了,无论是质量仍旧负载都比同步模型的 django 有优势。若是还是django
那套的话,我只得说相比较遗憾,毕竟那时候金山新员工大赛头牌就是自个儿和多少个小伙伴写的实时同步在线文档编辑系统,用的就是那套技术。

python的GIL导致导致力不从心真正的八线程,我们也许会说自己用多进度不就完了。但万一有的划算须求涉及到多进度并行,进度之间的报导支出也是只能考虑的。

故此那是个工程难题,并非语言难题。 Python
提必要了您了如此多工具,硬要选一个传统的,Old fashion
的,Python:怪我咯?

骨子里,Python 有宏可以绕开这么些GIL,不过呢架构设计得好其实可以免止的,到异步那块我会说。

django的网络是共同阻塞的,也就是说,即使大家须求拜访外部的一个劳务,在守候结果回到那段时光,django不可能处理其余其余的逻辑(当然,十六线程的不外乎)。如若访问外部服务要求很长日子,那就代表大家的总体服务大致在很长一段时间完全不可用。

为了化解那些标题,大家不得不不断的多开django进程,同时要求确保所有服务都能火速的拍卖响应,但思维那实际是一件很不可信赖的事务。

无状态的分布式处理利用多进度很便宜,譬如处理http请求,我们就是在nginx后边挂载了200七个django
server来处理http的,但这样八个经过自然导致全体机器负载偏高。

但尽管我们应用了七个django进度来处理http请求,对于一些超大量请求,python依然处理不回复。所以我们选拔openresty,将高频次的http请求使用lua来促成。可那般又造成使用几种开发语言,而且部分逻辑还得写两份分歧的代码。

一头模型并非不行,因为 overhead
丰盛低,很多作业场景下用同步模型反而会取得更好的效劳,比如豆瓣。同步模型最大的题材是对于
IO 密集型业务等待时间充分长,那时候需求的不是换语言
,而是唤醒你是否架设要改一下了。

若果臆度没错,你们现在还在用五年前写的 Gateway?这几个基于 django route
的流量分发层?四年前自己离开的时候已经小范围的采纳 Flask+Gevent Demo
测试过了,无论是质量仍旧负载都比同步模型的 django 有优势。借使如故django
那套的话,我只可以说相比遗憾,毕竟那时候金山新员工大赛头牌就是自身和多少个小伙伴写的实时同步在线文档编辑系统,用的就是那套技术。

固然tornado是异步的,不过python的mysql库都不帮忙异步,那也就表示借使大家在tornado里面访问数据库,我们依旧可能面临因为数据库难点导致的全套服务不可用。

从而这是个工程难题,并非语言难题。 Python
提必要了你了那样多工具,硬要选一个观念的,Old fashion
的,Python:怪我咯?

tornado 是有其一题材,可是 gevent 已经缓解了。我在 node.js
的某难题下已经回答过,对于 node 而言,能选取的异步模型只有一个,而
Python 就是太多选用了。其它 pypy+tornado+redis
能够随意虐各个长连接的场景,比如自己给我厂写过的一个 push service。

django的网络是一起阻塞的,也就是说,假设大家须求拜访外部的一个劳务,在等候结果重临那段日子,django不能处理任何其他的逻辑(当然,二十四线程的不外乎)。若是访问外部服务必要很长日子,那就象征大家的百分之百服务大致在很长一段时间完全不可用。

为了化解这几个标题,大家只好不停的多开django进程,同时要求有限支撑拥有服务都能很快的处理响应,但想想这实际是一件很不可信赖的事情。

骨子里异步模型最大的难点在于代码逻辑的割裂,因为是事件触发的,所以大家都是经过callback进行连锁处理,于是代码里面就平日出现干一件工作,传一个callback,然后callback里面又传callback的情况,这样的结果就是一切代码逻辑相当混乱。

一块模型并非不行,因为 overhead
丰盛低,很多事情场景下用同步模型反而会获取更好的效用,比如豆瓣。同步模型最大的题材是对于
IO 密集型业务等待时间充分长,那时候需要的不是换语言
,而是唤醒您是还是不是架设要改一下了。

这么些还真不是,假使说没有 ES6 的 JavaScript,可能真有 Callback
hell,但那是 Python 啊!Python 早就达成了左值绑定唉,yield
那架式比某些时刻吹的语言不通晓高到哪儿去了,当然我说的是一体化版的 Python3
yield。即使是不完整的 Python 2 yield
用以异步表明式求值也是一心丰硕的,tornado 的 gen.coroutine 啊。

虽说tornado是异步的,可是python的mysql库都不协理异步,那也就意味着一旦大家在tornado里面访问数据库,大家如故可能面临因为数据库难点造成的上上下下服务不可用。

协办形态写异步,在 Python
实力强的信用社内部早普及了,那是个工程难题,并非语言难点。当然把那种事怪在
Python 身上,Python:怪我咯?

tornado 是有其一题材,不过 gevent 已经解决了。我在 node.js
的某难题下一度回答过,对于 node 而言,能接纳的异步模型唯有一个,而
Python 就是太多选取了。其余 pypy+tornado+redis
可以随意虐种种长连接的现象,比如我给我厂写过的一个 push service。

python没有原生的协程帮衬,即使能够通过gevent,greenlet那种的上patch形式来支撑协程,但总归更改了python源码。其它,python的yield也足以展开简易的协程模拟,但说到底不可能跨堆栈,局限性很大,不清楚3.x的版本有没有革新。

骨子里异步模型最大的难题在于代码逻辑的割裂,因为是事件触发的,所以我们都是经过callback进行有关处理,于是代码里面就平常出现干一件工作,传一个callback,然后callback里面又传callback的景色,那样的结果就是全方位代码逻辑极度混乱。

任凭 Gevent 依旧 Greenlet 均没修改 Python 源码,事实上那货已经改为了
Py2 coroutine
的业内,加上豆瓣开源出来的greenify,基本上所有的库都可以平滑的异步化,包罗MySQL 等 C 一流的 lib。自从用上那套技术后,豆瓣的 Python dev
种种爽得不要不要的。

这么些还真不是,假如说没有 ES6 的 JavaScript,可能真有 Callback
hell,但那是 Python 啊!Python 早就完结了左值绑定唉,yield
那架式比某些时刻吹的语言不知道高到什么地方去了,当然我说的是全部版的 Python3
yield。即使是不完全的 Python 2 yield
用来异步表明式求值也是完全丰富的,tornado 的 gen.coroutine 啊。

当我首先次使用python开发项目,我是没得逞安装上项目须要的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他所有python目录打包给自身用,我才能健康的将品种跑起来。话说,现在有了docker,是何等令人甜蜜的一件事情。

而安插python服务的时候,大家须要在服务器下边安装一堆的包,光是这点就令人很困苦,尽管可以通过puppet,salt这么些自动化工具解决布置难点,但相比较而言,静态编译语言只用扔一个二进制文件,可就便宜太多了。

一头形态写异步,在 Python
实力强的商店里面早普及了,那是个工程难题,并非语言难点。当然把那种事怪在
Python 身上,Python:怪我咯?

正要我又是在付出基于 docker 的平台, docker
还真不是用来做布署那事的。首先, Python 是有 virtualenv
那一个工具的,事实上比较包管理和包隔离,Python 比 Go
高得不晓得哪儿去了。Python 跟 Git 谈笑风生的时候, Go 的 dev
们还得考虑自己怎么着才能使得 import
的包稳定在一个本子上(当然现在有很多第三方方案)。Virtualenv + Pip
完全可以兑现 Python
陈设自动化,所以这几个问题自己觉着是,工具链采纳难点。毕竟是个十几年的老鬼怪了,Python
啥意况没见过呀,各个包裹工具任君选用,强行说 Python
安排不便民,Python:怪我咯?

python没有原生的协程接济,即便能够透过gevent,greenlet那种的上patch情势来支撑协程,但到底更改了python源码。其余,python的yield也得以开展简短的协程模拟,但总归无法跨堆栈,局限性很大,不知晓3.x的本子有没有改革。

python非凡灵活简单,写c几十行代码才能搞定的作用,python一行代码没准就能缓解。不过太简单,反而导致众多同校不能对代码举行深层次的沉思,对一切架构进行密切的勘察。来了一个急需,啪啪啪,键盘敲完开速已毕,结果就是代码越来越混乱,最后导致了全体项目代码失控。

不论是 Gevent 照旧 格林let 均没修改 Python 源码,事实上那货已经化为了
Py2 coroutine
的正式,加上豆瓣开源出来的greenify,基本上所有的库都可以平滑的异步化,包涵MySQL 等 C 一级的 lib。自从用上那套技术后,豆瓣的 Python dev
各样爽得不要不要的。

曾经网易有个帖子问 Python
会不会稳中有降程序员编程能力
,我不得不说那真的很人有关。你不去想想深层次的事物怪语言卓殊是没道理的,那好,Go
里面 goroutine 是怎么落到实处的,一个带 socket 的 goroutine
最小能做到多少内存,思考过?任何语言都有投机的优势和逆风局,都亟需执行者自己去判断,一味的认为不难就不会长远思考那是有难点的。其余,代码混乱我认为如故工程上的控制力不够,豆瓣有跨越10W行的
Python 已毕,尽管不说很完美,大体上做到了不会混杂这么个对象。

当我第三回采用python开发品种,我是没成功安装上类别须求的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他任何python目录打包给自己用,我才能正常的将项目跑起来。话说,现在有了docker,是何等令人幸福的一件工作。

而安排python服务的时候,大家需求在服务器上面安装一堆的包,光是这点就令人很费劲,固然可以因而puppet,salt那些自动化工具解决安排难点,但相比较而言,静态编译语言只用扔一个二进制文件,可就有益太多了。

还有,C 写几十行搞定的 Python 一行解决那纯属是重点
feature,生产力啊,人士配备啊,招人作育的资金啊,从工程上来说,Python
在这一块完全是加分项,不是各类门类都务求最好的产出,极致的频率,做工程很多时候都是要取舍的。

刚刚我又是在付出基于 docker 的平台, docker
还真不是用来做安顿那事的。首先, Python 是有 virtualenv
那么些工具的,事实上相比较包管理和包隔离,Python 比 Go
高得不驾驭何地去了。Python 跟 Git 谈笑风生的时候, Go 的 dev
们还得考虑自己如何才能使得 import
的包稳定在一个本子上(当然现在有那多少个第三方方案)。Virtualenv + Pip
完全可以兑现 Python
计划自动化,所以那么些标题本身觉得是,工具链选拔难题。毕竟是个十几年的老魔鬼了,Python
啥情状没见过啊,各样包裹工具任君选拔,强行说 Python
陈设不便民,Python:怪我咯?

固然java和php都是最好的编程语言(我们都如此争的),但自身更赞成一门更简约的言语。而openresty,即使品质强悍,但lua照旧是动态语言,也会赶上前边说的动态语言一些题材。最终,前金山许式伟用的go,前快盘架构师葱头也用的go,所以大家很当然地挑选了go。

python万分灵活不难,写c几十行代码才能搞定的效果,python一行代码没准就能化解。不过太简单,反而造成不可胜道同桌不能对代码进行深层次的想想,对全体架构举行细致的考量。来了一个必要,啪啪啪,键盘敲完开速完毕,结果就是代码越来越混乱,最后导致了任何项目代码失控。

Openresty 用 lua
即使根据动态语言的角度去看,还真算不上,顶多是个大约点的
C。许式伟走的时候大部分都是
CPP,葱头近期自己还不驾驭他创业用的是怎么写的,不过她必定没言语倾向。当年随便
leo 仍然 ufa,一个用 Python 一个用 Java,
他都是从工程实际来摘取选拔什么的言语。

曾经和讯有个帖子问 Python
会不会下降程序员编程能力
,我只得说这实在很人有关。你不去想想深层次的东西怪语言万分是没道理的,那好,Go
里面 goroutine 是怎么落到实处的,一个带 socket 的 goroutine
最小能到位多少内存,思考过?任何语言都有投机的优势和逆风局,都急需执行者自己去看清,一味的以为不难就不会深深思考那是有标题标。此外,代码混乱我以为仍旧工程上的控制力不够,豆瓣有超越10W行的
Python 完成,固然不说很圆满,大体上落成了不会混杂这么个目标。

error,好吧,固然有语言洁癖的同班可能真正受不了go的语法,尤其是预订的末尾一个再次来到值是error。

再有,C 写几十行搞定的 Python 一行解决那相对是关键
feature,生产力啊,人员配置啊,招人作育的老本啊,从工程上来说,Python
在这一块完全是加分项,不是各类项目都必要最好的产出,极致的功能,做工程很多时候都是要取舍的。

这事实上是 Go style,无论是 go fmt 依然 error style,Go
其实是想抹平分裂工程师之间的作风难题。不再为了一个缩进和大括号地方怎么的浪费时间。那种格局并不是倒霉,只是我个人认为没
rust 那种重临值处理友善。

即使java和php都是最好的编程语言(我们都如此争的),但我更倾向一门更简便的言语。而openresty,即使品质强悍,但lua仍旧是动态语言,也会遇见前面说的动态语言一些题材。最后,前金山许式伟用的go,前快盘架构师葱头也用的go,所以大家很当然地挑选了go。

GC,java的GC发展20年了,go才那样点时间,gc铁定不到家。所以大家照例不可以轻易的写代码,不然在大请求量上面gc可能会卡顿整个服务。所以有时,该用对象池,内存池的顺其自然要用,固然代码丑了点,但好歹品质上去了。

Openresty 用 lua
固然根据动态语言的角度去看,还真算不上,顶多是个简易点的
C。许式伟走的时候大部分都是
CPP,葱头方今我还不知道她创业用的是怎样写的,可是他自然没言语倾向。当年无论
leo 依然 ufa,一个用 Python 一个用 Java,
他都是从工程实际来选择选择什么的语言。

1.4 开头 go 就是 100% 精确 GC
了,别的说到卡顿啊,完全和您怎么用对象有关,能内联绝不传引用一大半景观是一心够用的,这样
gc 的熏陶程度会低于。实在想用池……只可以说怎么不选 Java。

error,好吗,如果有语言洁癖的校友也许真的受不了go的语法,尤其是预约的末段一个重临值是error。

天生的交互辅助,因为goroutine以及channel,用go写分布式应用,写并发程序极度的简单。没有了蛋疼的callback导致的代码逻辑割裂,代码逻辑都是逐一的。

那实际是 Go style,无论是 go fmt 仍然 error style,Go
其实是想抹平差别工程师之间的风骨难点。不再为了一个缩进和大括号地点怎么的浪费时间。这种格局并不是不好,只是我个人认为没
rust 那种重临值处理友善。

那是有代价的,goroutine
的内存消耗总计(当然1.3如故1.4早先得到了很大的校订,内存最小值限制已经没了),channel
跨线程带来的特性损耗(跨线程锁),还有对 goroutine 的控制力几乎为 0
等。总而言之那种嘛,算不上是杀手级特性,大家都有,是便于了几许,但也有投机的害处。比如大家用
go 吧,平日就比较蛋疼 spawn 出去的 goroutine 怎么漂亮的
shutdown,反而有时候把业务做复杂化了。

GC,java的GC发展20年了,go才那样点时间,gc铁定不周全。所以大家照样不可能随便的写代码,不然在大请求量上面gc可能会卡顿整个服务。所以有时候,该用对象池,内存池的任其自然要用,纵然代码丑了点,但好歹品质上去了。

品质,go的习性可能赶不上c,c++以及openresty,但的确也挺强悍的。在大家的连串中,现在单机就安排了一个go的长河,就完全可以胜任之前200个python进程干的工作,而且CPU和MEM占用更低。

1.4 开首 go 就是 100% 精确 GC
了,其余说到卡顿啊,完全和您怎么用对象有关,能内联绝不传引用大多数情景是全然够用的,那样
gc 的震慑程度会低于。实在想用池……只可以说为何不选 Java。

自家不谨言慎行的实测大致 gevent+py2 能达成平等逻辑 go 达成的
30%~40%,pypy+tornado 能达到
80%~90%,混合了有些乘除和连接处理什么的。紧要仍旧看事情场景吧,纯粹的
CPU bound 当然是 go 好,纯粹的 IO bound 你就是用 C 也没用啊。

天然的相互支持,因为goroutine以及channel,用go写分布式应用,写并发程序卓殊的简单。没有了蛋疼的callback导致的代码逻辑割裂,代码逻辑都是逐一的。

运维安排,直接编译成二进制,扔到服务器下面就成,比python必要安装一堆的环境那是概括的太多了。当然,如若有cgo,大家也亟需将相应的动态库给扔过去。

那是有代价的,goroutine
的内存消耗总计(当然1.3照旧1.4从头获得了很大的改进,内存最小值限制已经没了),channel
跨线程带来的习性损耗(跨线程锁),还有对 goroutine 的控制力大致为 0
等。由此可见那种嘛,算不上是杀手级特性,我们都有,是便利了少数,但也有自己的害处。比如大家用
go 吧,经常就比较蛋疼 spawn 出去的 goroutine 怎么出色的
shutdown,反而有时候把作业做复杂化了。

咱俩今日根据 glibc 所处的 host
版本分歧有2套编译环境,看上去是布局简单了,编译起来坑死你。别的固然说
disk 便宜,这几行代码就几M了,集群同步安顿耗时在少数情形下还真会出篓子。

品质,go的品质可能赶不上c,c++以及openresty,但真正也挺强悍的。在大家的花色中,现在单机就安排了一个go的经过,就全盘可以胜任此前200个python进度干的作业,而且CPU和MEM占用更低。

付出作用,尽管go是静态语言,但本身个人感觉开发成效确实挺高,直觉下边跟python并驾齐驱。对于自身个人来说,最好的例证就是自家用go火速支付了更加多的开源组件,譬如ledisdb,go-mysql等,而那个最开始的版本都是在很短的年华里面完毕的。对于我们项目来说,大家也是用go在一个月就重构完毕了第二个本子,并揭示。

自己不小心的实测大致 gevent+py2 能达到同等逻辑 go 已毕的
30%~40%,pypy+tornado 能达到
80%~90%,混合了部分计量和三番五次处理什么的。紧要照旧看业务场景呢,纯粹的
CPU bound 当然是 go 好,纯粹的 IO bound 你尽管用 C 也没用啊。

go 的开发效用高是相比较 C,比较 python,大致后者只需求3天吧……

运维安排,直接编译成二进制,扔到服务器上面就成,比python必要安装一堆的条件那是简简单单的太多了。当然,若是有cgo,我们也须求将相应的动态库给扔过去。

简单的讲,Go 不是糟糕,Python
也不是那些,做工程嘛,无外乎就是考虑费用,时间资产,人力资本,维护资产等等。
Go 和 Python 互有千秋,就看取舍了。当然一定要说 Python
不行,Python:怪我咯?

大家明日基于 glibc 所处的 host
版本分裂有2套编译环境,看上去是布署简单了,编译起来坑死你。别的纵然说
disk 便宜,这几行代码就几M了,集群同步安顿耗时在好几情形下还真会出篓子。

支出功效,即便go是静态语言,但自己个人感觉开发功效确实挺高,直觉下边跟python齐轨连辔。对于自身个人来说,最好的例证就是自己用go飞快支付了格外多的开源组件,譬如ledisdb,go-mysql等,而那一个最起始的本子都是在很短的日子里面落成的。对于大家项目以来,我们也是用go在一个月就重构已毕了第二个版本,并表露。

go 的支出功效高是相比较 C,比较 python,差不离后者只需求3天呢……

一言以蔽之,Go 不是糟糕,Python
也不是可怜,做工程嘛,无外乎就是考虑资产,时间费用,人力资本,维护资金等等。
Go 和 Python 互有千秋,就看取舍了。当然一定要说 Python
不行,Python:怪我咯?

相关文章