说说立刻首「我干吗从python转向go」说说马上篇「我怎么打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 还是 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:怪我了?

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注