【Go】为什么用go; Golang Erlang 前世今生

给自己一条退路,再次比较Erlang和Golang

2014-6-28

陈叶皓 [email protected]

雨天的周末,适合码字的时节。。。

一年前我开始学习go语言的时候,如获至宝,既有python的编码效率,又带来性能的15倍提升。尤其是在异步编程方面,可以使用channel同步线程,不必加锁可以充分利用cpu多核计算,真是没有弱点。

后来慢慢了解到,这种无锁异步编程的思想,源自一门叫做erlang的语言,Erlang更加了不起。除了异步编程之外,这门语言天生支持分布式,单机上开发的软件,可以不加修改地运行在集群上,另外还支持软件版本的热升级,自带的OTP框架支持进程间的监督和重启,提供了坚如磐石的运行环境。Erlang是如此完美,我认为是最适合开发互联网应用的语言,一时间有种“终于找到真理”的喜悦。

不过那个时候,心里总觉得有什么地方不对,那就是,七牛CEO许式伟本身是Erlang高手,他却为自己的公司选择go语言,七牛成为一家只使用go语言进行开发的公司。

最近几天随着erlang学习的深入,慢慢找到了答案。Erlang实质是一门动态语言,它的动态类型,动态函数调用,都充分表现的动态语言的特征。Erlang是一个运行在虚机里面的动态语言,其实也不奇怪,只有动态语言,才容易实现软件版本的热升级。那动态语言有什么缺点,就是慢,动态语言因为时刻要进行类型推导,执行速度就是要比静态语言慢好几倍,所以,erlang自身所做的优化,就是尽可能把常用的功能用c语言实现,集成到erlang的虚机内,至于程序员编写的代码,也只能慢慢地执行了。

所以erlang适用的场景是,高并发且计算不密集,例如whatsapp,使用erlang编写,千万用户同时在线,高并发的典型场景,但是用户之间发送消息是不密集的,一个人打字能有多快,这个场景就特别适合erlang。

许式伟早就明白,七牛要提供的图片云存储,时刻需要大块磁盘IO,图片实时缩放需要大量CPU计算,选择静态语言go语言,可以提高性能,减少服务器的购买。

“世间安得双全法,不负如来不负卿”,高并发和密集计算其实是一对矛盾,当cpu服务于密集计算,自然无暇响应更多的请求。当然可以使用erlang搭建互联网服务,响应高并发地请求,然后把计算转移到cpu空闲的节点上,然而那些计算节点,如果是用静态语言(比如go语言)编写,会获得更好的性能。

在设计软件时,微观上,要识别哪些可以并发,哪些必须串行。宏观上,要识别哪些是IO密集,哪些是计算密集。永远没有标准答案,正是这个行业的魅力。

比较总结:

Erlang的优势,其中的2,3,4并没有别的语言可以匹敌

1.       高并发,异步编程的鼻祖,写并发代码很简单

2.       支持集群

3.       健壮(OTP的进程监督机制)

4.       代码热升级、热回滚

Go语言(scala,F#类似)的优势,

1.       高并发,支持异步编程

2.       高性能(静态语言的优势)

http://blog.sina.com.cn/s/blog_6e1bd8350102uwgl.html

时间: 2024-10-19 09:23:29

【Go】为什么用go; Golang Erlang 前世今生的相关文章

[转Go-简洁的并发 ]

http://www.yankay.com/go-clear-concurreny/ Posted on 2012-11-28by yankay 多核处理器越来越普及.有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的.随着Golang, Erlang, Scala等为并发设计的程序语言的兴起,新的并发模式逐渐清晰.正如过程式编程和面向对象一样,一个好的编程模式有一个极其简洁的内核,还有在此之上丰富的外延.可以解决现实世界中各种各样的问题.本文以GO语言为例,解释其中内核.外延. 并

Python大牛开小灶,一对一问答

CSDN知识小饭桌 大牛开小灶 小范围,高质量,在线交流QA 参与嘉宾   知识库特邀编辑伊海波,滴滴出行工程师,曾任龙图龙图游戏数据分析部技术负责人.CSDN博客专家,资深Python/Golang后端工程师,熟悉网络编程,关注数据分析,Web开发和Web安全. Python前景和相关资源 如何面试Python后端工程师 Python大牛小灶福利 Python 前景 Python 有以 Django 和 Flask 的形式组合的全栈/最小框架.Django 1.10 在去年 8 月发布,为 P

The Coroutine

关于Coroutine 说到coroutine就不的不说subroutine,也就是我们常用到的一般函数.调用一个函数开始执行,然后函数执行完成后就退出,再次调用的时候,再从头开始,调用之间是没有保存状态的:但是coroutine是可以在退出时如果再次被调用,可以从上一次退出的点继续执行.也就是说coroutine的调用之间是会保存状态的.如果有多个coroutine,就可以反复调用,但是两个coroutine相互前进.当一个coroutine退出时,不是return,而是yield,表示把当前

Golang-简洁的并发

多核处理器越来越普及.有没有一种简单的办法,能够让我们写的软件释放多核的威力?是有的.随着Golang, Erlang, Scala等为并发设计的程序语言的兴起,新的并发模式逐渐清晰.正如过程式编程和面向对象一样,一个好的编程模式有一个极其简洁的内核,还有在此之上丰富的外延.可以解决现实世界中各种各样的问题.本文以GO语言为例,解释其中内核.外延. 并发模式之内核 这种并发模式的内核只需要 协程 和 通道 就够了.协程负责执行代码,通道负责在协程之间传递事件. 不久前,并发编程是个非常困难的事.

python面试要点

作者:罗伊链接:https://www.zhihu.com/question/33398583/answer/59017861来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在这里我推荐几本书吧python参考手册,绝对让你更上一层楼图解密码技术,密码入门不二之选mysql技术内幕第五版,有点厚当手册读读,要有耐心,高性能mysql也强烈建议读读effective tcp/ip programming 为什么评论区有这么大差异?我想是个人经历不一样吧,如果是搞we

面试Python工程师会问哪些问题?需要准备什么?

随着互联网的发展,python语言现在变得越来越火爆,Python程序员越来越受到大家的青睐!那么想进入Python行业,面试时需要注意些什么问题呢?我们在参加Python开发岗位面试的时候都要做哪些准备?一般Python技术方面的面试会问哪些问题?今天,我们从2位面试官的角度来看看,参加 Python 开发岗面试需要做哪些准备. (一) 我之前在豆瓣负责过一段时间我们组的技术面试.由于现在不再去面试,可以爆一爆. 我从来不问google可获得的答案的问题, 只是问问面试者「在过去的工作中,遇到

virtualenv与virtualenvwrapper

一.Linux下安装.配置virtualenv 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁. 这里,就要隆重介绍 virtualenv,一个可以帮助我们管理不同 Python 环境的绝好工具. virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境. #指定清华源下载pip的包

python后端面试第七部分:项目部分--长期维护

##################    Python语法基础        ####################### 项目部分 4.python适合的场景有哪些?当遇到计算密集型任务怎么办? Python适合的场景1. 科学计算 2. 快速原型开发 3.网站. 4. 脚本. 实际上在各个方向上它都有挺多应用,前列几项算是比较火的吧.计算密集型任务模块用C/C++做.多进程,多线程也可以稍微提高些. 5.python高并发解决方案?我希望听到twisted->tornado->geve

golang

go语言特性: ◆ 自动垃圾回收 具备系统自动释放资源 ◆更丰富的内置类型 map类型.slice类型(类似vector) ◆函数多返回值 跟lua/erlang一样,支持函数多返回值,优化输入输出参数.结构体参数等传递 ◆错误处理 defer/recover/panic, defer用于资源的释放,go语言不提供构造和析构, recover截取错误处理流程,一般在使用defer的关键字函数中使用:若在无异常的goroutine中使用recover,会导致此goroutine所在的进程打印错误信