Clojure 相当于“演员”

aga*_*gam 2 clojure agent pulsar actor akka

我最近一直在研究 Elixir 和 Akka,这让我思考:Clojure 中的等价物是什么?

  • 我发现了一些关于代理与演员的“消息吞吐量比较”帖子,但它们来自 8 年前
  • 一个答案使用agents......但是这不是一样的东西(代理人似乎并不有其自身的逻辑,它们是由外部代码“采取行动”)
  • 另一个最近的答案是Pulsar 纤维(更接近,但......仍然保持?)

(我清楚,这可能是我“问错了问题在这里”,希望这是不是太开放式)

and*_*hut 8

Rich Hickey 在他 2008 年的演讲“Clojure Concurrency”中明确区分了代理和演员,提到了它们彼此不同的几种方式。如果您想快速找到其中的一些评论,请在本演讲的记录中搜索“agent”和“actor”:https : //github.com/matthiasn/talk-transcripts/blob/master/Hickey_Rich/ClojureConcurrency.md

更多关于 clojure.org 代理和演员之间的差异:https : //clojure.org/about/state#actors

显然,有人比我更了解原始 Hewitt 演员模型,这可能对阅读有用:http : //www.dalnefre.com/wp/2010/06/actors-in-clojure-why-不是/

我的理解是,如果你想要 Erlang 风格的 actor,你基本上需要线程/进程之间不可靠的消息队列。在不同的进程之间,有很多方法可以实现不可靠的消息传递,Clojure 中没有内置方法,但所有方法都可以通过 Java 互操作获得。

  • 模拟不可靠的消息队列当然非常容易:从可靠的消息队列开始,任意丢弃消息! (3认同)