为什么 Akka Actor 的默认行为是一个接一个地处理消息?
Why is default behavior of Akka Actor to process messages one after the other?
我读到 akka actor 一个接一个地处理消息。为什么是这样?
我无法理解的是“为什么消息的同步执行是默认行为?”。我确实明白,对于并行执行邮箱消息,功能(要执行的作业)应该有 0 个副作用。
这是默认的 akka 行为,因为具有绝对独立执行和 0 副作用的用例是少数,我们通常处理需要公共资源的作业。
如果 scala 和函数式编程的设计目标是 0 副作用代码,下面的场景适用,那么为什么这不是 akka actor 消息处理中的默认行为。
如果您看一下 Akka docs,您会发现两种保证之一是按发送方-接收方对进行消息排序。如果消息以不确定的顺序处理,则此保证将受到损害。
我的理解是,actor 模型的一个关键点是使并行编程更易于理解(并且更简单 "get right"),并且没有死锁等难以调试的问题。
之所以有效,是因为:
- 您可以通过创建多个参与者并在它们之间分配工作负载来轻松实现并行性。
- 每个 actor 内部的代码都是单线程的,并且 actor 的状态对其他 actor 是隐藏的,因此您不需要保护 actor 的内部状态免受并发访问问题的影响。
如果 actor 可以并行处理多条消息,它可以同时访问自己的内部状态,那么您将不得不担心锁、同步、ConcurrentModificationException
s...这会失败重点。
我读到 akka actor 一个接一个地处理消息。为什么是这样?
我无法理解的是“为什么消息的同步执行是默认行为?”。我确实明白,对于并行执行邮箱消息,功能(要执行的作业)应该有 0 个副作用。
这是默认的 akka 行为,因为具有绝对独立执行和 0 副作用的用例是少数,我们通常处理需要公共资源的作业。
如果 scala 和函数式编程的设计目标是 0 副作用代码,下面的场景适用,那么为什么这不是 akka actor 消息处理中的默认行为。
如果您看一下 Akka docs,您会发现两种保证之一是按发送方-接收方对进行消息排序。如果消息以不确定的顺序处理,则此保证将受到损害。
我的理解是,actor 模型的一个关键点是使并行编程更易于理解(并且更简单 "get right"),并且没有死锁等难以调试的问题。
之所以有效,是因为:
- 您可以通过创建多个参与者并在它们之间分配工作负载来轻松实现并行性。
- 每个 actor 内部的代码都是单线程的,并且 actor 的状态对其他 actor 是隐藏的,因此您不需要保护 actor 的内部状态免受并发访问问题的影响。
如果 actor 可以并行处理多条消息,它可以同时访问自己的内部状态,那么您将不得不担心锁、同步、ConcurrentModificationException
s...这会失败重点。