Akka演员避免突变状态

乔山

我是使用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)
  }
}

国家在带有示例的第二版中去哪儿了?

爱奥努·斯坦(Ionuț G. Stan)

该州由Akka机器持有。receive每次您调用become时,都会产生一堆被“突变”“块” unbecome

堆栈表示为与的不可变List绑定var

在两个地方List替换了:

与Erlang相比,Akka无法使用递归调用创建的执行堆栈来对状态进行编码,因为这意味着阻塞调用。Akka无法承受其任何线程上的阻塞调用,因此它需要一个var

Akka的receive可能给人以递归调用的错觉,但请记住,一个receive块返回一个PartialFunction,当被调用时,调用start

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章