在使用Scala Akka时,我们仍然考虑阻止IO,并尝试使用模式来避免它,我觉得使用线程没有任何区别。隐式异步IO是一个巨大的差异化因素,Erlang和Go在语言层面提供它,而Scala Akka则不然。我觉得斯卡拉阿卡不是真正的演员模特。
这是一篇受欢迎的博文Don't use Actors for concurrency,但它不是演员模特的问题,它纯粹是阿卡的问题。
答案 0 :(得分:4)
Akka实现了Carl Hewitt et al 在1973年指定的演员模型:演员可以在收到消息时
没有任何地方可以说明I / O应该如何处理。另一方面,将阻塞方法调用自动转换为actor-suspending方法调用违反了模型:actor只对消息起作用,没有别的,并且声明一些任意方法调用以防止在某些(可能是无限制的)时间内发生这种情况。不属于模特。
Akka通过公开可以发送命令并可以从中接收结果的ActorRef,为以Actor模式方式呈现的网络操作提供IO工具。 Akka Streams包括异步消费和从I / O通道生成数据。
我希望这能解释为什么我的总体答案是问题的前提是有缺陷的。
答案 1 :(得分:2)
你的问题的前提是不准确的 (" ......斯卡拉阿卡没有。")。来自akka documentation:
演员给你:
简单和高级的并发和并行抽象。 异步,非阻塞和高性能事件驱动 编程模型。非常轻量级的事件驱动流程(几个 每GB堆内存百万个演员)。
传递给Actor的异步消息的基本示例:
val actorSystem = ActorSystem()
val actorRef = actorSystem actorOf Props[SomeActor]
val message = ??? //some message value
actorRef ! message //asynchronous message passing
事实上,akka超过original Actor Model specification能够按名称查找Actors。
对于IO而言,akka提供了许多非阻塞解决方案:
当然,Scala语言没有嵌入的Actor模型。但它为并发计算提供了Futures和并行集合。
你引用的博客的要点是,Futures对于并发计算(I agree with)要好得多,而Actors用于维护状态。它没有声称Actors不能并发。
另外,akka不只是演员。有代理,有限状态机,akka流(实现reactive manifesto)和akka-http库。