Akka是真正的演员模型吗?
Is Akka real actor model?
在使用Scala Akka的时候,我们还是想着阻塞IO,用pattern尽量避免,我觉得跟用线程没什么区别。隐式异步 IO 是一个巨大的区别,Erlang 和 Go 在语言级别提供它,而 Scala Akka 则没有。我感觉Scala Akka不是真正的actor模型
有一篇博文很火postDon't use Actors for concurrency,但其实不是actor模型的问题,纯粹是Akka的问题
你的问题前提不准确
(“……Scala Akka 没有。”)。来自 akka documentation:
Actors give you:
Simple and high-level abstractions for concurrency and parallelism.
Asynchronous, non-blocking and highly performant event-driven
programming model. Very lightweight event-driven processes (several
million actors per GB of heap memory).
异步消息传递给 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 更适合并发计算(),而 Actors 则用于维护状态。它并不是说 Actors 不能并发。
此外,akka 不仅仅是演员。有代理、有限状态机、akka 流(实现 reactive manifesto)和 akka-http 库。
Akka 实现了 Carl Hewitt 等人 在 1973 年指定的 Actor 模型:Actor 可以在收到消息后
- 向它知道的 actor 发送有限数量的消息
- 创建有限数量的演员
- 确定要应用于下一条消息的行为
这并没有说明 I/O 应该如何处理。另一方面,将阻塞方法调用自动转换为 actor 挂起方法调用是对模型的违反:actor 仅对消息起作用,没有别的,并声明一些任意方法调用以防止这种情况在某些(可能是无限的)时间内发生是不是模型的一部分。
Akka 为以 Actor 模型方式呈现的网络操作提供 IO 设施,方法是公开一个可以向其发送命令并可以从中接收结果的 ActorRef。 Akka Streams 包括来自和到 I/O 个通道的数据的异步消费和生产。
我希望这能解释为什么我的总体回答是问题的前提是有缺陷的。
在使用Scala Akka的时候,我们还是想着阻塞IO,用pattern尽量避免,我觉得跟用线程没什么区别。隐式异步 IO 是一个巨大的区别,Erlang 和 Go 在语言级别提供它,而 Scala Akka 则没有。我感觉Scala Akka不是真正的actor模型
有一篇博文很火postDon't use Actors for concurrency,但其实不是actor模型的问题,纯粹是Akka的问题
你的问题前提不准确 (“……Scala Akka 没有。”)。来自 akka documentation:
Actors give you:
Simple and high-level abstractions for concurrency and parallelism. Asynchronous, non-blocking and highly performant event-driven programming model. Very lightweight event-driven processes (several million actors per GB of heap memory).
异步消息传递给 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 更适合并发计算(
此外,akka 不仅仅是演员。有代理、有限状态机、akka 流(实现 reactive manifesto)和 akka-http 库。
Akka 实现了 Carl Hewitt 等人 在 1973 年指定的 Actor 模型:Actor 可以在收到消息后
- 向它知道的 actor 发送有限数量的消息
- 创建有限数量的演员
- 确定要应用于下一条消息的行为
这并没有说明 I/O 应该如何处理。另一方面,将阻塞方法调用自动转换为 actor 挂起方法调用是对模型的违反:actor 仅对消息起作用,没有别的,并声明一些任意方法调用以防止这种情况在某些(可能是无限的)时间内发生是不是模型的一部分。
Akka 为以 Actor 模型方式呈现的网络操作提供 IO 设施,方法是公开一个可以向其发送命令并可以从中接收结果的 ActorRef。 Akka Streams 包括来自和到 I/O 个通道的数据的异步消费和生产。
我希望这能解释为什么我的总体回答是问题的前提是有缺陷的。