concurrency - Actor 模型中的仲裁者如何在 Erlang 中实现?

标签 concurrency functional-programming erlang actor actor-model

我知道Erlang使用Actor模型来支持并发,Erlang进程和Actors一样:发送消息,不可变等等。但是根据 Carl Hewitt 的说法,Actor 模型中的一件重要事情是不确定性和仲裁器(给定一个仲裁器,您可以同时将多个输入(例如 I0 和 I1)输入到仲裁器中,但只有一种可能的结果(例如 O0或 O1) 将在另一端出来)。
所以,我很感兴趣 Erlang 是如何实现这个概念的? Erlang并发模型/actor模型实现中Arbiters的作用是什么?

最佳答案

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

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

关于concurrency - Actor 模型中的仲裁者如何在 Erlang 中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40498119/

相关文章:

performance - 这两种模式匹配哪种方式更受欢迎?

F# zip 实现

parallel-processing - 如何在 Erlang 中实现以下循环?

unix - 自 1970 年 1 月 1 日以来的秒数 00 :00:00 GMT Erlang

java - 在 Windows 上用 Java 并发写入文件

multithreading - Erlang中Actor的基本解释

java - 尽管使用 flowlayout,JFrame 组件仍能够通过 repaint 调用 PaintComponent

sql - PostgreSQL 行读锁

haskell - 函数式编程语言自省(introspection)

Erlang 追踪器源代码