我已经读到Akka Actor又一个接一个地处理消息。为什么是这样?
我无法缠绕我的头是"为什么同步执行默认行为的消息?"。我确实知道,对于邮箱消息并行执行,功能(将要执行的作业)应具有0个副作用。
是这种默认的AKKA行为,因为具有绝对独立执行和0个副作用的用例是少数群体,我们通常与需要共同资源的作业一起工作。
如果Scala和功能编程的设计目标是0个副作用代码,以下方案对此保持正确,那么为什么在Akka Actor消息处理中不是默认行为。
我的理解是,演员模型的一个关键点是使并行编程更简单地理解(并且更简单地"正确地"),而没有难以删除的问题,例如死锁。
这是因为:
- 您可以通过创建多个参与者并将工作量分开来轻松实现并行性。
- 每个演员内部的代码都是单线线,演员的状态被其他参与者隐藏,因此您无需保护演员的内部状态免受并发访问问题的侵害。
如果演员可以并行处理几条消息,则可以同时访问其自己的内部状态,您将不得不担心锁,同步,ConcurrentModificationException
S ...它将失败。
如果您查看akka文档,您会发现两个保证之一是每个发送器收选对的消息订购。如果以不确定的顺序处理消息,此保证将被损害。