如何在支持演员模型的语言中"实现"?

Jay*_*Jay 12 concurrency erlang scala actor

Gul Agha在其技术报告"Actors:分布式系统中的并发计算模型"中很好地描述了演员模型.

在页49,他解释了"成为"命令:

become <expression>
Run Code Online (Sandbox Code Playgroud)

在调用"成为X"之后,演员将所有消息转发到另一个演员的邮箱(X).

但是,我不确定如何在Erlang和Scala等语言中实现它(它实现了它).我需要手动编码吗?效率怎么样?Agha使用消息传递显示堆栈的实现.每次执行弹出或推送时,都会向某个actor添加一个转发链接......经过数十万次操作后,我希望这样的实现花费太多时间转发消息而不做实际工作,除非一些引擎盖下进行了很好的优化.

所以我的问题是:如何在典型的演员语言中实现转发(或"成为"),如Erlang,Scala(以及其他语言的库)?

Mar*_*tos 7

它不是直接在Erlang中实现的,但您可以编写一个become接收消息的简单函数,将其转发到另一个进程然后调用自身:

become(Pid) ->
    receive
        Msg -> Pid ! Msg
    end,
    become(Pid).
Run Code Online (Sandbox Code Playgroud)

(工业强度版本可能需要处理信号和其他可能性和结束,但这是它的本质.)

呼叫become(Pid)将从Pid外部世界的角度有效地将呼叫过程转变为进程.

这并没有解决您突出显示的问题,反复调用become导致转发链增长.但是,这通常不会出现在Erlang中,我不确定Erlang的进程如何映射到Actor模型.


Eri*_*cht 3

请参阅 Agha 论文“Actors: A Model of Concurrent Computation in Distributed System”的第 12 页(我拥有的 PDF 副本的第 26 页)。“成为”是他的演员语言,你如何指定#2,即演员的新行为。将消息转发给另一个参与者只是许多可能的新行为之一。

我认为,如果您想要转发行为,那么对于 Scala Actor,您基本上与 Erlang 处于同一条船上。在幕后,Scala“react”和“reactWithin”的工作方式很像become,因为react块定义的部分函数是actor的新行为,但我不确定这种相似性是否是故意的。

大多数(全部?)“演员”实现与 Hewitt 的演员模型和 Agha 的演员语言有相当大的偏差。IIRC 在 Agha 语言中指定演员行为的语言部分甚至不是图灵完备的。只有当您考虑参与者的配置时,整个语言才变得图灵完整。我想说 Actor 模型和当前 Actor 框架之间的关系有点像 SmallTalk 中的面向对象与 C++ 中的面向对象的关系。有一些概念转移和类似的术语,但在细节上它们非常非常不同。