恩看了马上首自己怎么起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 还是 Greenlet 均没改 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:怪我了?