演员模型中的仲裁者是如何在 Erlang 中实现的?

How Arbiters from the actor model are implemented in Erlang?

我知道 Erlang 使用 Actor 模型来支持并发,Erlang 进程与 Actors 相同:它们发送消息、不可变等。但是根据 Carl Hewitt 的说法,Actor 模型中的一件重要事情是不确定性和仲裁器(给定一个仲裁器,您可以同时将多个输入(例如 I0 和 I1)输入仲裁器,但只有一个可能的结果(例如 O0或 O1) 将在另一端出来)。

所以,我很感兴趣 Erlang 是如何实现这个概念的? Erlang并发model/actor模型实现中Arbiters的作用是用什么?

这变得非常哲学化(参见 https://en.wikipedia.org/wiki/Indeterminacy_in_concurrent_computation),但据我所知,他说的是在 Actor 模型中,只要一个 actor 有多个输入,就会有一个魔术盒决定以任何方式对传入消息进行排序,即使这意味着将某些消息延迟任意长(但有界)的时间。也就是说,您永远不能依赖任何特定的顺序或时间来接收并行消息,即使程序结构似乎有利于特定的到达顺序。 (请注意,这是推理 actor 程序的理论概念——您不会在实践中尝试使系统不必要地随机化,除非出于测试目的。)

Erlang 消息传递的语义说的几乎是同一件事:只要两个进程各自向第三个进程发送一条消息,并且对各个发送事件没有顺序约束,你永远不能依赖哪个消息会发送最先出现在收件人的邮箱中。它们可以被任意延迟,即使所有进程 运行 在同一个 Erlang VM 中。同样,这是关于您作为程序员获得的保证 (none),而不是让 Erlang VM 插入随机延迟。 (随机延迟可以由其他因素自然引入,例如页面错误的 OS 级暂停。)