说说这篇「我怎么从python转向go」

恩看了这篇我干吗从python转向go,看来作者也是
KSO
轻办公/集团快盘团队的。作为快盘从无到有一代的工程师之一(总是被潇洒哥说他们改我留给的
bug ),又恰恰是 Python/Go 双修(大雾其实我是 Rust
党),其实一起先自己是拒绝的,duang duang duang,这就顺手写一些把。

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

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

  • string那样的周转时不当。

在python里面,可以允许同名函数的出现,后一个函数会覆盖前一个函数,有三遍我们系统一个很惨重的荒唐就是因为这一个导致的。

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

此外,函数作为第一目的,在 Python 中是 feature,Go 要写个
mock,简直虐得不要不要的。

实则这一个一向是很两个人吐槽python的地点,可是想想,python最初步是为了化解吗问题而被支付出来的?我们就是要将他用到高性能服务器开发方面,其实也是有点难为它。

假设没记错,无论是轻办公或者快盘,是重 IO 不重
CPU,最大耗时是多少块加密这块,我在的时候是 Java
写的。此外高性能服务器选 Go 也是虐得不要不要的,各样小心翼翼避免GC。大多数无比气象下,pypy 的习性足矣胜任了,我认为这不算充足规范。

python的GIL导致导致力不从心真正的多线程,我们可能会说我用多进程不就完了。但假如局部计量需要涉及到多进程并行,进程之间的报道支出也是只可以考虑的。

实际,Python 有宏可以绕开这多少个GIL,可是呢架构设计得好其实可以制止的,到异步这块我会说。

无状态的分布式处理利用多进程很有利,譬如处理http请求,我们就是在nginx前边挂载了200多少个django
server来处理http的,但如此两个过程自然导致全部机器负载偏高。

但就算我们应用了五个django进程来拍卖http请求,对于一些超大量请求,python如故处理不过来。所以我们运用openresty,将高频次的http请求使用lua来促成。可这般又造成使用二种开发语言,而且部分逻辑还得写两份不同的代码。

假定算计没错,你们现在还在用五年前写的 Gateway?这一个基于 django route
的流量分发层?四年前我离开的时候已经小范围的行使 Flask+Gevent Demo
测试过了,无论是性能仍然负载都比同步模型的 django 有优势。倘若还是django
这套的话,我只可以说相比较遗憾,毕竟这时候金山新职工大赛头牌就是自个儿和几个小伙伴写的实时同步在线文档编辑系统,用的就是那套技术。

故而这是个工程问题,并非语言问题。 Python
提供给了您了这么多工具,硬要选一个价值观的,Old fashion
的,Python:怪我咯?

django的网络是一起阻塞的,也就是说,假若大家需要拜访外部的一个服务,在伺机结果回到那段时日,django不可能处理任何另外的逻辑(当然,多线程的除了)。假若访问外部服务需要很长日子,这就表示大家的任何服务几乎在很长一段时间完全不可用。

为通晓决这个题材,我们只能不停的多开django进程,同时需要确保拥有服务都能很快的拍卖响应,但想想那实质上是一件很不靠谱的事体。

联机模型并非不行,因为 overhead
充足低,很多事务场景下用同步模型反而会拿到更好的效率,比如豆瓣。同步模型最大的题目是对此
IO 密集型业务等待时间充裕长,这时候需要的不是换语言
,而是唤醒您是不是架设要改一下了。

尽管tornado是异步的,可是python的mysql库都不协助异步,这也就代表假诺我们在tornado里面访问数据库,我们仍旧可能面临因为数据库问题导致的漫天服务不可用。

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

实在异步模型最大的题目在于代码逻辑的隔离,因为是事件触发的,所以我们都是通过callback进行相关处理,于是代码里面就平时现身干一件业务,传一个callback,然后callback里面又传callback的景观,这样的结果就是全方位代码逻辑极度混乱。

那一个还真不是,假若说没有 ES6 的 JavaScript,可能真有 Callback
hell,但这是 Python 啊!Python 早就实现了左值绑定唉,yield
这架式比某些时刻吹的语言不清楚高到哪个地方去了,当然我说的是完好版的 Python3
yield。尽管是不完整的 Python 2 yield
用以异步表明式求值也是截然够用的,tornado 的 gen.coroutine 啊。

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

python没有原生的协程协助,即使可以因此gevent,greenlet这种的上patch形式来支撑协程,但毕竟更改了python源码。其余,python的yield也足以展开简易的协程模拟,但到底无法跨堆栈,局限性很大,不了解3.x的版本有没有立异。

任由 Gevent 依旧 格林(Green)let 均没修改 Python 源码,事实上这货已经变成了
Py2 coroutine
的专业,加上豆瓣开源出来的greenify,基本上所有的库都可以平滑的异步化,包括
MySQL 等 C 顶尖的 lib。自从用上这套技术后,豆瓣的 Python dev
各类爽得不要不要的。

当我先是次使用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他整整python目录打包给我用,我才能健康的将品种跑起来。话说,现在有了docker,是多么令人甜蜜的一件业务。

而部署python服务的时候,大家需要在服务器下面安装一堆的包,光是这一点就令人很劳顿,尽管可以经过puppet,salt这个自动化工具解决部署问题,但相比较而言,静态编译语言只用扔一个二进制文件,可就方便太多了。

恰巧我又是在支付基于 docker 的阳台, docker
还真不是用来做安排这事的。首先, Python 是有 virtualenv
这么些工具的,事实上比较包管理和包隔离,Python 比 Go
高得不晓得啥地方去了。Python 跟 Git 谈笑风生的时候, Go 的 dev
们还得考虑自身如何才能使得 import
的包稳定在一个版本上(当然现在有很多第三方方案)。Virtualenv + Pip
完全可以兑现 Python
部署自动化,所以这一个问题我认为是,工具链选择问题。毕竟是个十几年的老妖怪了,Python
啥意况没见过啊,各个包裹工具任君选取,强行说 Python
部署不便利,Python:怪我咯?

python相当灵活简单,写c几十行代码才能搞定的功力,python一行代码没准就能解决。可是太简单,反而造成成千上万同桌不可以对代码举行深层次的沉思,对任何架构举办精雕细刻的勘查。来了一个急需,啪啪啪,键盘敲完开速实现,结果就是代码越来越混乱,最后导致了整个项目代码失控。

早就网易有个帖子问 Python
会不会降低程序员编程能力
,我不得不说那实在很人有关。你不去思辨深层次的东西怪语言极度是没道理的,这好,Go
里面 goroutine 是怎么落实的,一个带 socket 的 goroutine
最小能完成多少内存,思考过?任何语言都有和好的优势和劣势,都亟需执行者自己去看清,一味的认为简单就不会深切思考这是有问题的。此外,代码混乱我觉着依然工程上的控制力不够,豆瓣有抢先10W行的
Python 实现,尽管不说很完善,大体上形成了不会混杂这么个对象。

再有,C 写几十行搞定的 Python 一行解决这相对是生死攸关
feature,生产力啊,人员安排啊,招人培养的血本啊,从工程上的话,Python
在这一块完全是加分项,不是每个体系都要求极其的面世,极致的效能,做工程很多时候都是要取舍的。

尽管java和php都是最好的编程语言(我们都这样争的),但自我更赞成一门更简明的言语。而openresty,固然性能强悍,但lua依旧是动态语言,也会遇到前面说的动态语言一些题目。最终,前金山许式伟用的go,前快盘架构师葱头也用的go,所以大家很当然地采用了go。

Openresty 用 lua
假如依据动态语言的角度去看,还真算不上,顶多是个简单点的
C。许式伟走的时候大多数都是
CPP,葱头如今我还不了然他创业用的是何等写的,不过她必然没言语倾向。当年无论
leo 依旧 ufa,一个用 Python 一个用 Java,
他都是从工程实际来挑选取取什么的言语。

error,好呢,如若有语言洁癖的同学也许真的受不了go的语法,尤其是预约的尾声一个再次回到值是error。

这实质上是 Go style,无论是 go fmt 依然 error style,Go
其实是想抹平不同工程师之间的风格问题。不再为了一个缩进和大括号地方怎么的浪费时间。这种艺术并不是欠好,只是自我个人认为没
rust 这种再次回到值处理友善。

GC,java的GC发展20年了,go才这样点时间,gc铁定不周到。所以我们照样不可能随意的写代码,不然在大请求量下面gc可能会卡顿整个服务。所以有时候,该用对象池,内存池的肯定要用,即便代码丑了点,但好歹性能上去了。

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

天赋的彼此协助,因为goroutine以及channel,用go写分布式应用,写并发程序非常的容易。没有了蛋疼的callback导致的代码逻辑割裂,代码逻辑都是逐一的。

这是有代价的,goroutine
的内存消耗总计(当然1.3依然1.4发端拿到了很大的精益求精,内存最小值限制已经没了),channel
跨线程带来的特性损耗(跨线程锁),还有对 goroutine 的控制力几乎为 0
等。显而易见这种嘛,算不上是杀手级特性,我们都有,是有利于了几许,但也有和好的坏处。比如我们用
go 吧,平日就比较蛋疼 spawn 出去的 goroutine 怎么精粹的
shutdown,反而有时候把业务做复杂化了。

特性,go的属性可能赶不上c,c++以及openresty,但真正也挺强悍的。在大家的品类中,现在单机就配置了一个go的过程,就全盘可以胜任往日200个python进程干的作业,而且CPU和MEM占用更低。

本身不审慎的实测大概 gevent+py2 能落得平等逻辑 go 实现的
30%~40%,pypy+tornado 能达到
80%~90%,混合了一些总计和连接处理什么的。首要如故看业务场景吧,纯粹的
CPU bound 当然是 go 好,纯粹的 IO bound 你即便用 C 也没用啊。

运维部署,间接编译成二进制,扔到服务器上边就成,比python需要设置一堆的条件这是粗略的太多了。当然,假若有cgo,我们也需要将相应的动态库给扔过去。

咱俩前几日依照 glibc 所处的 host
版本不同有2套编译环境,看上去是布局简单了,编译起来坑死你。此外即便说
disk 便宜,这几行代码就几M了,集群同步部署耗时在某些情形下还真会出篓子。

支出效用,即便go是静态语言,但本身个人感觉开发效率确实挺高,直觉上边跟python连镳并轸。对于自身个人来说,最好的例证就是本身用go连忙支付了丰盛多的开源组件,譬如ledisdb,go-mysql等,而这个最先河的版本都是在很短的刻钟里面完成的。对于大家项目以来,大家也是用go在一个月就重构完成了第一个本子,并发表。

go 的开支效能高是比较 C,相比 python,大概后者只需要3天吧……

显而易见,Go 不是不佳,Python
也不是十分,做工程嘛,无外乎就是考虑资金,时间成本,人力成本,维护成本等等。
Go 和 Python 互有千秋,就看取舍了。当然一定要说 Python
不行,Python:怪我咯?

网站地图xml地图