说说就首「我干吗从python转向go」说说这首「我怎么打python转向go

by admin on 2018年10月5日

恩看了立篇我为什么从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:怪我了?

发表评论

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

网站地图xml地图