Erlang的并发模型是什么?

4
我最近阅读了一篇论文《事件为何不好》,该论文对基于事件和线程的高并发服务器进行了比较研究,并最终得出结论:在这种情况下,线程比事件更好。我发现我无法将erlang暴露的并发模型归类。Erlang提供轻量级进程,但这些进程大部分时间都被挂起,直到收到某个事件/消息为止。/Arun

如果进程大部分时间都被挂起,那么这是问题及其解决方案的属性,而不是 Erlang 并发模型本身的属性。 - rvirding
那篇论文已经有7年了,比较了一些现在被认为有点过时的实现技术(例如Java 1.4),这些技术也在争论的双方都使用过。有人可以指出同一领域更近期的研究吗? - Donal Fellows
2个回答

16

Erlang并发模型的基础原则如下:

  • 轻量级并发。您应该能够在应用程序中高效创建所需的所有进程,并且可以在必要时高效地创建和删除它们。这意味着进程是轻量级和小巧的,不需要使用进程池来节省时间。

  • 异步通信。所有进程之间的通信都是通过异步消息传递完成的,仅此而已,没有其他方法。

  • 错误处理。与轻量级并发和异步消息一样,错误处理也是构建强大系统的基础。处理这些问题的基本操作与并发操作交互,并构成了Erlang并发模型的一部分。

  • 进程隔离。进程之间根本没有共享状态,唯一的通信方式是通过消息传递。这对于构建强大系统至关重要,因为它允许进程崩溃而不会破坏其他进程的状态。当然,它们可能会通过错误处理机制接收到进程崩溃的信息,但崩溃不会在其他进程中创建不一致的状态。其应对措施是:没有全局数据。

这些是Erlang并发模型的基本原则。您可能会看到它们以不同方式表达,但它们基本上是相同的。Erlang还拥有不可变数据,这是一个重大优点,但这实际上不是并发模型的一部分,消息传递和进程隔离就足够了。在某些圈子中,这可能被认为是异端邪说。

正如您所看到的,actors只是该模型的一部分。错误处理是基础,但通常被忽视。忽略它意味着您已经错过了其中的一部分。

注:Erlang进程是真正的进程/线程,它们有自己的生命周期,并不仅仅是事件驱动协程的形式。进程可以愉快地进行业务,改变其内部状态,而不仅仅是受外部事件驱动。


@rvirding 谢谢..这确实解决了很多问题。实际上,我对这篇论文感到有些困惑:http://lamp.epfl.ch/~phaller/doc/haller07actorsunify.pdf .. 它基本上讲述了Scala中的Actors是试图统一线程和事件的一种尝试,并考虑到Actors受到Erlang进程的启发,我认为这就是轻量级进程首先被提出的动机.. - arun_suresh
1
不,有趣的是,即使演员模型比Erlang更古老,我们当时也没有听说过它们。直到后来有人提到Erlang遵循了演员模型,我们才知道。 - rvirding

12

@Yasir 我同意,但是Actor模型看起来像是事件模型和线程模型的混合体。 - arun_suresh
1
@Arun:例如Erlang中的Actor模型使用所谓的Green线程,在VM而不是OS中进行调度,因此它们的重量要轻得多。我认为线程模型允许您同时修改某种全局状态(例如变量),而在Actor模型中,每个Actor只能根据接收到的消息更改自己的状态。 我认为Actor模型比事件模型更灵活,因为您无需重写Actor的代码即可从多个发送方接收消息。 - YasirA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接