给自己一条退路,再次比较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. oracle PL/SQL(procedure language/SQL)程序设计--控制结构(if else )

    IF逻辑结构:IF-THEN-END IFIF-THEN-ELSE-END IFIF-THEN-ELSIF-END IF 语法 IF condition THEN  statements;[ELSIF ...

  2. 剑指Offer25 二叉搜索树转换为排序双向链表

    /************************************************************************* > File Name: 25_BSTCon ...

  3. 业务系统的JVM启动参数推荐

    关键业务系统的JVM启动参数推荐,原文链接请参见:http://calvin1978.blogcn.com/articles/jvmoption-2.html

  4. 关于arraylist.remove的一些小问题。

    public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Integer> ...

  5. 记录一下,关于错误提示:could not find a part of path “X:\”的解决办法

    Win2k在NTFS系统下可能会出现这样的错误提示,解决办法很简单,只要在网站所在系统盘根目录给ASPNET用户读取权限就可以了,因为原因就是 Server.MapPath() 这个方法,这个方法是让 ...

  6. Sass之初识

    Sass is the most mature, stable, and powerful professional grade CSS extension language in the world ...

  7. HTML、JS、CSS之特殊字符

    可能这是冷知识了,并不为多数人知道像HTML.JS.CSS它们的特殊字符的写法,我也是在网上收录的在这里make一下: 箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HT ...

  8. Java之组合数组2

    编写函数Fun,其功能是将两个两位数的正整数A.B合并为一个整数放在C中,将A数的十位和个位一次放在C的个位和十位上,A数的十位和个位一次放在C的百位和千位上.例如,当 A=16,B=35,调用该函数 ...

  9. Objective-C 【电商APP应用代码-系统分析-详细注释-代码实现】

    ------------------------------------------- 电商APP应用 ************************************************ ...

  10. AMQ学习笔记 - 19. 问题解决 - 控制Atomikos的日志输出

    概述 在使用Atomikos为ActiveMQ提供JTA支持时,Atomikos在控制台打印了繁琐的日志.这里介绍如何控制Atomikos日志输出的粒度. 解决方案 基于以下三个事实: Atomiko ...