Erlang已经存在了30多年,并且在多核CPU出现之前就已经很好地构建了。 但是,这是一种今天再没有相关性的语言! 该语言的基础体系结构非常适合于每台计算机和移动设备上的现代CPU。
我正在撰写本文的计算机具有2.2 GHz英特尔酷睿i7 CPU,但更重要的是它具有八个内核。 简而言之,它可以一次执行八个任务。
利用这些核心的能力在许多语言中都存在,但是常常感到不合时宜或充满陷阱和挑战。 如果您曾经担心过互斥锁 , 共享的可变状态和代码是线程安全的 ,那么您至少要注意几个陷阱。
在Erlang中,因此利用Erlang VM(BEAM)的Elixir使编写和推理并发代码变得毫不费力。 Ruby有一些很棒的库可以帮助编写并发代码,而Elixir是内置的并且是一流的公民。
这并不是说编写高度并发或分布式的系统很容易。 离得很远! 但是有了Elixir,语言就在您身边。
进程,PID和邮箱
在开始研究如何在Elixir中编写并发代码之前,先了解一下我们将要使用的术语以及Elixir使用的并发模型是一个好主意。
演员模型
Elixir(和Erlang)中的并发基于Actor模型 。 Actor是单线程进程,可以在它们之间发送和接收消息。 Erlang VM管理它们的创建,执行和通信。 他们的记忆是完全孤立的,这使得不必担心“共享状态”是没有问题的。
- 流程 :类似于OS级别的线程,但轻巧得多。 这本质上是Elixir中并发的单位。 进程由BEAM(Erlang运行时)管理,BEAM负责将工作分散到CPU的所有核心上,甚至分散到网络上的其他BEAM节点上。 一个系统一次可以拥有数百万个这样的进程,因此您不必害怕充分利用它们。
- 进程ID(PID) :这是对特定进程的引用。 就像Internet上的IP地址一样,PID是您告诉Elixir要将消息发送到哪个进程的方式。
- 邮箱 :为了使进程之间可以相互通信,将来回发送消息。 当消息发送到流程时,它到达该流程的邮箱。 接收坐在其邮箱中的邮件取决于该过程。
因此,将所有内容放在一起,Elixir中的一个过程就是演员。 它可以通过向特定的PID发送消息来与其他参与者进行通信。 收件人可以通过检查其邮箱中是否有新邮件来接收邮件。
编写并发代码
在本节中,我们将研究Elixir中如何实际使用并发的Actor模型。 <