说说立刻首「我何以从python转向go

作者 CMGS 2015.05.17
15:47*

写了7891字,被143人关注,获得了97个喜欢

字数3748 阅读24227 评论21 喜欢81

恩看了当时首自身胡起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 还是 Greenlet 均没修改 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地图