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

2014-6-28

陈叶皓 chenyehao@gmail.com

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

一年前我开始学习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

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

  1. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  2. The Coroutine

    关于Coroutine 说到coroutine就不的不说subroutine,也就是我们常用到的一般函数.调用一个函数开始执行,然后函数执行完成后就退出,再次调用的时候,再从头开始,调用之间是没有保存 ...

  3. go语言之并发

    简介           多核处理器越来越普及,那有没有一种简单的办法,能够让我们写的软件释放多核的威力?答案是:Yes.随着Golang, Erlang, Scale等为并发设计的程序语言的兴起,新 ...

  4. Python招聘需求与技能体系

    目前国内的招聘Python,基本都是偏向web后台开发,偶有高大上的数据挖掘&机器学习. 这是之前(2012年)找工作整理的一些JD,在梳理几年来的笔记,顺带理一理 可以以此建立自己的技能体系 ...

  5. [转载] Go语言并发之美

    原文: http://qing.blog.sina.com.cn/2294942122/88ca09aa33002ele.html 简介           多核处理器越来越普及,那有没有一种简单的办 ...

  6. [转Go-简洁的并发 ]

    http://www.yankay.com/go-clear-concurreny/ Posted on 2012-11-28by yankay 多核处理器越来越普及.有没有一种简单的办法,能够让我们 ...

  7. Python后端开发要求

    关于Python后端开发要求 一.对Python有兴趣,熟悉Python(标准库) 最好阅读过源码 了解Python的优化(熟悉pypy更佳) 二.至少至少一门语言(不说"精通") ...

  8. python面试(3)

    一.语言 推荐一本看过最好的python书籍? 拉开话题好扯淡 谈谈python的装饰器,迭代器,yield? 标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗? pyth ...

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

    CSDN知识小饭桌 大牛开小灶 小范围,高质量,在线交流QA 参与嘉宾   知识库特邀编辑伊海波,滴滴出行工程师,曾任龙图龙图游戏数据分析部技术负责人.CSDN博客专家,资深Python/Golang ...

随机推荐

  1. 给VPS装桌面

    转自:百度经验  致谢! 1.首先我们要先升级一下软件源给安装桌面环境做准备. 执行命令:apt-get update   2.安装桌面环境或窗口管理器: apt-get install xubunt ...

  2. Eclipse中web项目的默认发布路径改为外部Tomcat中webapp路径

    可参考http://www.cnblogs.com/mihu/p/4772509.html 和http://www.cnblogs.com/dyllove98/archive/2013/06/07/3 ...

  3. Oracle数据库作业-1

    设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表 ...

  4. html中的一些标签学习

    今天看手册学习到了HTML5很多属性.现在总结如下 <body bgcolor="BED1A2" text="FFFFFF" link="yel ...

  5. html使用空格对齐文本(&nbsp;&emsp;&ensp;)

    字符以及HTML实体 描述以及说明   这是我们使用最多的空格,也就是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个).要使用html实体表示才可累加. ...

  6. 2015英特尔® 实感™ (Intel® RealSense™) 动手开发实验课

    2015年英特尔® 全球实感技术动手实验课路演来到中国, 这次在中国将有北京和广州两站,包括一天的动手实验室活动 - 面向对感知计算.3D 开发和虚拟现实兴趣浓厚的开发人员.英特尔专家将会指导您如何借 ...

  7. Sql Server 数据库之间如何进行跨网远程连接访问

    场景说明 现在有一台A电脑和一台B电脑,两台电脑都安装了Sql Server数据库,两台电脑不在一个局域网(我们考虑的是不同网络的两台数据库连接),比如A电脑在公司,B电脑在家里,现在我要在家里用B电 ...

  8. Java学习之Java的单例模式

    单例模式有一下特点: 1.单例类只能有一个实例.2.单例类必须自己自己创建自己的唯一实例.3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个 ...

  9. AMQ学习笔记 - 09. Spring-JmsTemplate之接收

    概要 JmsTemplate提供了4组*3,共计12个接收用的方法.   JmsTemplate接收所需要的资源ConnectionFactory和Destination,和发送是一致的.   接收的 ...

  10. PHP的接口(interface)

    接口声明了函数和字段,但不会给出实现的细节 规则: 1.类全部为抽象方法(不需要声明abstract) 2.接口抽象方法必须是public 3.成员(字段)必须是常量 interface Comput ...