作家
登录

Elixir与Go多角度对比:背景+编程风格+并发处理

作者: 来源: 2018-03-27 11:28:16 阅读 我要评论

沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践!

为了限制一个特定的队列所能遭受的最高并发,Go 管道实现了缓冲区用于接收指定命量的消息(用数量限制发送者)。默认情况下,如不雅还没预备好接收消息,管道一向是浊宣的,除非是设定了缓冲区。


Elixir与Go多角度比较:背景+编程风格+并发处理

译者语:

之前一向做 Python 和 Rails(临时代替 Ruby) 的开辟。 这两种说话都有本身的优势,应用都很广泛,但也不乏出缺点,最凸起的问题莫过于机能了。所以,在高并发到来之前,须要寻找高机能的说话来做替补,重要用来替代 Rails 的角色。

Golang 是起首想到的,但在 Rails 社区 Elixir可以说高机能的代名词。在查找这两门说话比较的时刻,发清楚明了这篇文┞仿。

在以前的几年迈, Elixir 和 Go 的风行度均有巨大年夜的进步。这两种说话平日能知足开辟人员寻找的高并发筹划。它们遵守很多类似的原则,但两者都对一些特别场景下的应用做了折中。

下面经由过程它们的背景、编程风格及并发的处理比较这两门说话。

1.来源

Go/Golang自2009年起由Google研发,以二进制文件( 编译后)的情势运行在安排的平台上。 最开端的时刻,它被作为一种测验测验去 创建一种新的编程说话, 以解决其他编程说话的重要弊病,并保持其优势。

Go在实现开辟速度、并发性、机能、稳定性、可移植性和可保护性的均衡方面做得异常出色。是以,Docker和InfluxDB都是用Go构建的,包含谷歌、Netflix、Uber、Dropbox、SendGrid和SoundCloud在内典范多大年夜公司都在应用它来做分类对象。

传统意义上,线程所涉及的并发是比较重量的。比来,一些编程说话开端应用"轻线程"或"绿线程", 实际上它是在单个线程里应用一个调剂器来治理不合逻辑的轮流履行。

Erlang自1986由爱立信开辟,用于高可用分布式德律风体系。它已经扩大到诸如收集办事器等很多其他范畴,并已经实现了9个9的可用性(31毫秒/年的停机时光)。

Elixir的设计目标是在保持与Erlang生态体系兼容性的同时,还可以或许在Erlang VM中实现更高的可扩大性和临盆力。 它经由过程在Elixir代码中应用Erlang库来实现这个目标,反之亦然。

为了避免反复,我们将Elixir / Erlang / BEAM统称为“Elixir”。

编程风格

懂得每个运行时的核心道理,才能对 Elixir 和 Go 做靠得住比较,因为这些构建块是说话的基本。

Go是一种对传统C系编程背景的仁攀来说更轻易熟悉的说话, 尽管它做了一些有利于函数式编程的设计。Go的静态类型,指针和构造体,会让你有种似曾了解的感到。

函数可以附加到构造体类型,这种组合方法跟着时光的推移更能促进项目标增长。函数可以在任何处所创建并附加到构造体,而不是将其嵌入到必惺攀扩大的对象中。

如不雅一个办法须要被犊熘类型的构造体调用时,可认为这个办法定义一个接口以便于供给更大年夜的灵活性。典范的面向对象的编程说话必鼓起首定义一个对象来实现一个特定的接口, 与之不合的是Go中的接口将被主动应用于与之相匹配的任何事物。

Go的接话柄例:

  • https://gobyexample.com/interfaces

Elixir 更偏向于函数式风格, 但融合了一些面向对象说话的道理,使它的┞封种过渡不显得那么违和。

变量是弗成变的,因为应用消息传递,就不须要传递指针,这意味着函数调用是异常直接的。 传入参数,返回结不雅,没有其他影响。 这简化了一些例如测试和代码可读性方面的问题。

因为数据弗成变,诸如for轮回之类的常见操作是弗采取的,因为无法创建一个递增的计数器。尽管Enum(列举)库以一种简单的方法供给了常见的迭代模式,但递归平日被用来代替这类操作。

因为递归应用频繁,是以Elixir还专门做了尾部调用优化。如不雅函数的最后一次调用的是本身,则可以防止调用客栈的增长,大年夜而避免客栈溢掉足误。

Elixir广泛的采取模式匹配,这与Go应用接口的方法异常类似。 应用Elixir,函数可以定义为:

应用 map 模式作为函数的参数,只有当传入的 map 包含键为 data, 值为嵌套的 map, 且值中又包含键为 nift 值为 bob 和 别的一个键为 other_thing的时刻,改函数才会被调用。而此时,变量other才会被赋值。

大年夜函数参数到变量赋值,尤其是递归,都邑用到模式匹配。这里有些例子,可以感触感染一下。 构造可以被定义为类型,然后也可以在模式匹配中应用。

大年夜道理上讲,这两种办法是异常类似的。两者都将数据构造和数据操作分开。同时也都是经由过程匹配来定义函数的调用,Go 经由过程接口,而 Elixir 经由过程模式匹配。

尽管 Go 许可函数经由过程特定的类型调用, g.area(), 但实际上这跟 area(g)是一样的。两者之间的独一差别,在Elixir中 area()须要返回结不雅,而 Go 则是在内存诚实现了一次引用。

因为采取这种办法,这两种说话的组合性变得异常强,在项目标全部生命周期中,不消去控制、扩大、注入以及重建大年夜的持续树。这对大年夜项目来说是个重大年夜的利好。

此处最大年夜的差别是,应用 Go 的时刻,为了重用这种模式会在函数外定义,但如不雅组织不好,可能导致创建大年夜量反复的接口。Elixir 不克不及简单的复竽暌姑模式,但模式老是在应用它的处所定义。

Elixir应用"strong" typing(强类型)而不是static typing(静态类型), 并且大年夜部分是揣摸出来的。在 Elixir 中, 没有符号重载,所以不克不及用+连接两个字符创会让你感到很困惑。在 Elixir 中,<>可以用来连接字符串。

 1/4    1 2 3 4 下一页 尾页

  推荐阅读

  北京地铁将全部实现扫码进站 预计上半年正式启用

沙龙晃荡 | 3月31日 京东、微博、华为拭魅战专家与你合营商量容器技巧实践! 细心的市平易近不难发明,地铁部分进出站闸机已经新增了二维码辨认区域。日前,记者探访发明,除了此前已经试水扫>>>详细阅读


本文标题:Elixir与Go多角度对比:背景+编程风格+并发处理

地址:http://www.17bianji.com/lsqh/40936.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)