【问题标题】:What is Erlang's concurrency model actually?Erlang 的并发模型到底是什么?
【发布时间】:2010-04-25 09:47:33
【问题描述】:

我最近在看一篇论文Why Events are Bad。该论文对基于事件和基于线程的高并发服务器进行了比较研究,最后得出结论指出,在这种情况下,线程优于事件。

我发现我无法分类 erlang 公开了哪种并发模型。 Erlang 提供轻量级进程,但这些进程大部分时间都处于挂起状态,直到它收到某种事件/消息。

/阿伦

【问题讨论】:

  • 如果进程大部分时间都被挂起,那么这是问题的一个属性,它的解决方案不是 Erlang 并发模型本身。
  • 那篇论文已有 7 年的历史,比较了争论双方的一些实现技术,这些技术现在被认为有些过时(例如 Java 1.4)。有人愿意指出同一地区最近发生的事情吗?

标签: multithreading events erlang


【解决方案1】:

Erlang 并发模型基于以下前提:

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

  • 异步通信。所有进程通信都是通过异步消息传递,就这样,没有别的了,nada。

  • 错误处理。就像轻量级并发和异步消息是构建并发系统的基础一样,错误处理是构建健壮系统的基础。其原语与并发交互,是 Erlang 并发模型的一部分。

  • 进程隔离。进程之间根本没有共享状态,唯一的通信方式是通过消息传递。这是能够构建健壮系统的基础,因为它允许进程崩溃而不会破坏其他进程。当然,他们可能会通过错误处理机制收到进程崩溃的信息,但崩溃永远不会在其他进程中创建不一致的状态。一个推论是没有全局数据。

这些是 Erlang 并发模型的基本前提。您可能经常看到它们以不同的方式表达,但它们基本相同。 Erlang 也有不可变的数据,这是一个巨大的胜利,但这并不是并发模型的一部分,消息传递和进程隔离就足够了。在某些圈子里,这可能被视为异端观点。

如您所见,Actor 只是模型的一部分。错误处理是基本但经常被忽视的。忽略它意味着你错过了一部分。

注意Erlang 进程是适当的进程/线程,因为它们有自己的生命,而不仅仅是一种事件驱动的协程。流程可以在不受外部事件驱动的情况下愉快地开展业务并更改其内部状态。

【讨论】:

  • @rvirding 谢谢.. 这当然清楚了很多。实际上我对这篇论文有点困惑:lamp.epfl.ch/~phaller/doc/haller07actorsunify.pdf .. 基本上是在谈论 Scala 中的 Actor 如何尝试统一线程和事件,并考虑到 Actor 受到 Erlang 进程的启发这一事实,我认为这是首先是轻量级流程..
  • 不,有趣的是,即使 Actor 比 Erlang 还要老,我们当时还没有听说过它们。直到后来人们提到 Erlang 遵循了我们发现的 Actor 模型。
【解决方案2】:

我猜它叫Actor model

【讨论】:

  • @Yasir 我同意,但 Actor 模型看起来像是事件和线程模型的混合体......
  • @Arun:来自 e 的演员模型。 G。 Erlang 使用所谓的绿色线程,在 VM 中而不是在 OS 中调度,因此它们的重量要轻得多。我相信线程模型允许您同时修改某种全局状态(例如变量),而在 Actor 模型中,每个 Actor 只能根据收到的消息更改自己的状态。我认为 Actor 模型比 Event 模型更灵活,因为您无需重写 Actor 的代码即可接收来自多个发送者的消息。
猜你喜欢
  • 2015-12-24
  • 2019-09-24
  • 2013-08-12
  • 1970-01-01
  • 2014-02-06
  • 2015-02-12
  • 2011-09-08
  • 2014-05-06
相关资源
最近更新 更多