我阅读了一篇关于Erlang/OTP和actor模型的interesting blog post文章。我还听说Scala支持actor模型。根据我目前收集到的一点信息,actor模型将处理分解为通过传递消息相互通信的组件。通常,这些进程是不可变的。
这些特性是特定于语言的,还是更多地在体系结构级别?更具体地说,你不能在几乎任何语言中实现相同的角色模型,并使用某种形式的消息队列在工作进程之间传递消息吗?(例如,使用类似celery的东西)。或者像Erlang和Scala这样的语言只是透明地和much faster地做这件事?
4条答案
按热度按时间dgtucam11#
当然,您可以用几乎任何语言定义一个“Actor Library”,但是在Erlang中,模型是内置到语言中的,并且实际上是唯一可用的并发模型。
虽然Scala的actors系统实现得很好,但最终它仍然容易受到Erlang所不具备的一些危害的影响。
对于以支持共享可变状态的任何命令式语言实现的任何Actor库,情况都是如此。
一个有趣的例外是Nodes.js。我们正在对节点之间的参与者进行一些工作,这些节点可能表现出与Erlang相同的隔离属性,这仅仅是因为没有共享的可变状态。
jobtbby32#
演员模型不局限于任何特定的平台或编程语言,它毕竟只是一个模型。
Erlang和Scala对这个模型有非常好和有用的实现,它非常适合这些平台的典型技术栈,并有助于有效地解决某些类型的任务。
kx7yvsdv3#
To add to the points mentioned above, the fact that in Erlang actor model is the only way you can program, makes your code scalable from the get-go. Erlang processes are lightweight, and you can spawn 10-100K on one machine (I don't think you can do it with python), this changes the way you approach problems. For example, in our product we parse web server logs with Erlang and spawn an Erlang process to handle each line. That way, if one log line is corrupted, or the process that handles it crashes, nothing happens to the other ones. Another difference is when you start using OTP you get processes supervisors and you can make processes connected so if one terminates all the others do. Other than that, Erlang has some other nice feature (which can be found in other languages through libraries, but again here it's baked in) like pattern matching and hot deploy.
uz75evzq4#
不,关于Actor模型没有任何语言特定的东西。事实上,您在问题中已经提到Scala,其中Actor不是语言的一部分,而是作为库实现的。(实际上,有三个相互竞争的库。)
然而,就像函数式编程或面向对象编程一样,在C语言中直接支持Actor编程,或者至少支持一些使其更容易实现的抽象,将带来非常不同的编程体验。任何用C语言做过函数式编程或面向对象编程的人都可能理解这一点。