我知道 Erlang 使用 Actor 模型来支持并发,并且 Erlang 进程和 Actor 一样:它们发送消息、不可变等。但是根据 Carl Hewitt 的说法,Actor 模型中的一件重要的事情是不确定性和仲裁器(给定一个仲裁器,您可以同时有多个输入(例如 I0 和 I1)进入仲裁器,但只有一个可能的结果(例如 O0或 O1)将在另一端出来)。
所以,我很感兴趣 Erlang 是如何实现这个概念的?而在 Erlang 并发模型/actor 模型实现中,Arbiters 的作用又是什么?
我知道 Erlang 使用 Actor 模型来支持并发,并且 Erlang 进程和 Actor 一样:它们发送消息、不可变等。但是根据 Carl Hewitt 的说法,Actor 模型中的一件重要的事情是不确定性和仲裁器(给定一个仲裁器,您可以同时有多个输入(例如 I0 和 I1)进入仲裁器,但只有一个可能的结果(例如 O0或 O1)将在另一端出来)。
所以,我很感兴趣 Erlang 是如何实现这个概念的?而在 Erlang 并发模型/actor 模型实现中,Arbiters 的作用又是什么?
这变得非常哲学化(参见例如https://en.wikipedia.org/wiki/Indeterminacy_in_concurrent_computation),但据我所知,他是说在演员模型中,只要演员有多个输入,就会有一个魔术盒它以任何它想要的方式决定传入消息的顺序,即使这意味着将某些消息延迟任意长(但有界)的时间。即,您永远不能依赖任何特定的顺序或时间来接收并行消息,即使程序结构似乎有利于某个到达顺序。(请注意,这是推理参与者程序的理论概念 - 在实践中,您不会尝试使系统不必要地随机化,除非出于测试目的。)
Erlang 消息传递的语义说的几乎相同:每当两个进程分别向第三个进程发送消息,并且对各个发送事件没有顺序限制时,您永远不能依赖哪个消息将首先出现在收件人的邮箱。即使所有进程都在同一个 Erlang VM 中运行,它们也可能被任意延迟。同样,这是关于你作为程序员得到的保证(无),而不是让 Erlang VM 插入随机延迟。(随机延迟可以由其他事物自然引入,例如页面错误的操作系统级暂停。)