Elixir: 编程语言的未来

这篇文章谈一谈最近火爆的 Elixir,同时说一下对编程语言选择的看法。同时作为 Erlang 发烧友,Elixir 不可不提。即使有了那么多编程语言 Elixir 也值得接触。

Elixir: 编程语言的未来

Elixir 并不是一个最近出现的语言。但是近期 Elixir 的生态逐渐完善,越来越多的专家开始关注这门语言,并且 给予 Elixir 好评

现在开始接触 Elixir

一个小的 Elixir 例子

并行处理 JSON 字符串输入,并且解析成可用的变量,计算每秒处理的速度并输出。

https://github.com/doubaokun/exsample

Elixir: 编程语言的未来

用 entop 监控 Elixir 应用状态

Elixir: 编程语言的未来

对编程语言选择的一点看法

作为个语言发烧友,之前接触过 JavaErlang、Scala、PHP、、C#、C、Python、Ruby 等一大堆各种风格的编程语言。有人说,学那么多编程语言是想做”翻译”吗?其实事情并不那么简单。

不同的语言背后是风格截然不同的类库群、技术堆栈、生态和工具链。不同的语言针对了不同类型的问题。某些语言解决某些问题的成本会比其他语言低非常多。回归本质,学习编程语言还是为了低成本高效的解决实际的业务问题。

个人喜欢的编程语言风格 可以近实时更新变更

最好不需要长时间编译才能执行、应用启动快。

Java、 C 编译很慢,不适合频繁修改的项目。但是 PHP 、Node.js 修改即可见,可以极大提高开发效率。最好还能 hot-reload 就像很多前端工具一样,只要源码有一点变更,不需要刷新页面自动反应在浏览器中。Play framework 类似的自动加载功能也可以。

更进一步,能够在生产环境热加载就更好了,更新代码不影响用户。针对这一点,很多人乐了, PHP 默认就是这样的啊,部署后刷新 APC 缓存就可以实现。
这正是无状态、短链接的 HTTP 应用的优势,虽然随之而来的是性能相对降低更多 TCP 的开销,但是把问题变得简单很多。但是很多其他语言做到这点就很难了,比如大部分 Java 应用。

Elixir、Erlang 可以做到真正的任何情况下开着跑车换轮子。

关于热加载,见另一篇文章:编程开发常用的热加载工具。

支持并发执行

人们更习惯顺序执行的思路,并且大部分业务逻辑都是顺序执行的。但是为了降低延迟、提高性能,最好能在语言层面支持并发执行。比如,一个操作开始还未返回结果,就可以开始另一个操作。
这样调用远程 API 或者远程 RPC,耗时为最慢那一个操作的耗时。从这一点看,大部分流行语言都可以做到并发调用,但 PHP 难以做到。

轻量级执行进程或者线程

由于某些限制,某些业务逻辑不可避免的会因为大量计算、网络磁盘 IO 等占用一个执行进程或者线程。所以希望这个执行体能够尽量轻量级,很少的内存占用,很快的启动时间,很少的切换消耗,最好能在 IO 执行的时候自动让出计算资源。

并发和并行

我们更多关注并发,但是比较少关注并行。因为通过增加机器数量能抗住大量用户的请求比节省机器更加简单和迫切。
这也是很多互联网公司动辄几百台上千台服务器的现状。用户和请求量的多少由于业务逻辑的不同很难比较,只能比较机器数量了。

并发之进程模型

PHP 既是典型的这种模式。曾经见过某异步 PHP 框架 CS 高居不下,甚至比业务逻辑的 CPU 使用更高。

并发之线程模型

这种模型相对于进程模型好了很多,因为线程比进程轻量很多,创建、切换也快很多。

问题:线程和内核线程的关系为多对多,内核线程有限。能够调度的用户线程有限,无法充分利用多核性能。创建新线程消耗非常大。IO 阻塞无法释放计算资源。

每个 CPU 核心只能同时运行一个线程,多个线程之间需要切换调度(CS)。如果是 CPU 密集类型的计算,没有或者很少 IO 操作,最好启动 CPU 核心数量的线程。
但是如果有 IO 操作,比如 磁盘或者网络,多余 CPU 核心数的线程有效,因为 IO 操作的时候可以切换到其他线程执行 CPU 操作。

并发之 Fork-join 轻量级进程模型:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/638ffa34bf8a8d1fc274975a80088eed.html