我正在阅读一篇关于 Erlang/OTP 和 actor 模型的有趣博文。我还听说 Scala 支持演员模型。从我目前收集的少量信息来看,actor 模型将处理分解为通过传递消息相互通信的组件。通常,这些过程是不可变的。
这些功能在架构级别是特定于语言还是更多?更具体地说,你不能用几乎任何语言实现相同的actor模型,并且只使用某种形式的消息队列在工作进程之间传递消息吗?(例如,使用像celery这样的东西)。还是像 Erlang 和 Scala 这样的语言只是透明且更快地做到这一点?
当然,您几乎可以用任何语言定义“Actor Library”,但在 Erlang 中,该模型已融入该语言,并且实际上是唯一可用的并发模型。
尽管 Scala 的 actor 系统实现得很好,但归根结底,它仍然容易受到 Erlang 无法避免的一些危害的影响。我会提请你注意这篇论文。
对于以任何支持共享可变状态的命令式语言实现的任何 Actor 库都是如此。
一个有趣的例外是 Nodes.js。正在对节点之间的参与者进行一些工作,这些参与者可能表现出与 Erlang 相同的隔离属性,仅仅是因为没有共享的可变状态。
Actor模型不限于任何特定的平台或编程语言,它毕竟只是一个模型。
Erlang 和 Scala 对这个模型有非常好的和有用的实现,它非常适合这些平台的典型技术堆栈,并有助于有效地解决某些类型的任务。
除了上面提到的几点之外,在 Erlang 中,actor 模型是您可以编程的唯一方式这一事实,使您的代码从一开始就可扩展。Erlang 进程是轻量级的,你可以在一台机器上生成 10-100K(我认为你不能用 python 做到这一点),这改变了你处理问题的方式。例如,在我们的产品中,我们使用 Erlang 解析 Web 服务器日志并生成一个 Erlang 进程来处理每一行。这样,如果一个日志行损坏,或者处理它的进程崩溃,其他日志行不会发生任何事情。另一个区别是,当您开始使用 OTP 时,您将获得流程主管,并且您可以使流程连接起来,因此如果一个终止了其他所有流程。除此之外,Erlang 还有一些其他不错的功能(可以通过库在其他语言中找到,但在这里再次强调)
不,Actor 模型没有特定于语言的内容。实际上,您已经在问题中提到了 Scala,其中演员不是语言的一部分,而是作为库实现的。(实际上是三个相互竞争的库。)
然而,就像函数式编程或面向对象编程一样,直接支持 Actor 编程,或者至少支持一些使其更容易实现的抽象,在语言中将导致非常不同的编程体验。任何曾经用 C 语言进行过函数式编程或面向对象编程的人都可能会理解这一点。