【问题标题】:How Arbiters from the actor model are implemented in Erlang?演员模型中的仲裁者如何在 Erlang 中实现?
【发布时间】:2017-03-22 17:46:55
【问题描述】:

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

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

【问题讨论】:

    标签: concurrency functional-programming erlang actor actor-model


    【解决方案1】:

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

    Erlang 消息传递的语义表达了几乎相同的内容:每当两个进程分别向第三个进程发送消息,并且对各个发送事件没有顺序限制时,您永远不能依赖哪个消息会结束首先在收件人的邮箱中。即使所有进程都在同一个 Erlang VM 中运行,它们也可能被任意延迟。同样,这是关于你作为程序员得到的保证(无),而不是让 Erlang VM 插入随机延迟。 (随机延迟可以由其他事物自然引入,例如页面错误的操作系统级暂停。)

    【讨论】:

    • 在实践中,您会按照消息到达流程的顺序查看消息。
    • 是的,但是即使在 Erlang 中,如果发送者在不同的调度线程上,到达顺序也是不可预测的。发送操作可以按一个顺序(挂钟时间)完成,但消息仍可能以交换顺序到达接收者的邮箱。
    • 我不是专家,但我不认为休伊特的标记存在任何“魔法盒子”,相反,我在逻辑上认为到达时间在一定程度上是不确定的,因为“程序”由于“系统”的处理时间,例如无法保证交货顺序(甚至交货本身)网络、CPU、I/O 电路?那么实际处理时间似乎与不确定性有关?不过,我可能不理解编程语言(如 Erlang)中仲裁器的抽象,你能详细说明一下吗?
    • @HeddevanderHeide 我的解释是,仲裁器是一种纯粹的理论设备,包括在内是为了完整描述当您有多个消息发送到同一接收器时发生的情况。例如,为了能够重播一个场景,您需要包括仲裁者在每个执行步骤中做出的决定,其中可以选择消息。决策仍然可以是随机的,但可以重播,正如带有特定种子的 PRNG 给出的那样。
    猜你喜欢
    • 2011-08-14
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多