我是使用Akka演员的新手。最近,我读到有关分布式参与者或远程参与者(无论您如何称呼)的信息。到目前为止,我一直很满意在Actor中使用state并在我的receive方法中对其进行突变。快乐的时光!现在,我想在多个JVM上分布我的角色,并且我已经看到角色中的状态可能是个问题。
我确实读过关于变得和变得不受欢迎的信息,我只是想知道Akka在内部如何处理这一问题?
带有状态:
class TestActor extends Actor {
var state = List.empty[String])
def receive =
case Add(elem) => state + elem
case Contains(elem) => sender() ! state.contains(elem)
}
}
删除状态:
class TestActor extends Actor {
def receive = start(List.empty[String])
def start(lst: List[String]): Receive = {
case Add(elem) =>
context become start(lst+ elem)
case Contains(elem) =>
sender() ! lst.contains(elem)
}
}
国家在带有示例的第二版中去哪儿了?
该州由Akka机器持有。receive
每次您调用become
或时,都会产生一堆被“突变”的“块” unbecome
。
堆栈表示为与的不可变List
绑定var
。
在两个地方List
替换了:
与Erlang相比,Akka无法使用递归调用创建的执行堆栈来对状态进行编码,因为这意味着阻塞调用。Akka无法承受其任何线程上的阻塞调用,因此它需要一个var
。
Akka的receive
块可能给人以递归调用的错觉,但请记住,一个receive
块返回一个PartialFunction
,当被调用时,调用start
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句