率先作者说 Python 是动态语言。首先作者说 Python 是动态语言。

恩看了即首本人胡起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:怪我了?

相关文章