阿卡演员避免变异状态

spa*_*rkr 1 scala akka

我很擅长使用Akka演员.最近,我读到了分布式演员或远程演员(无论你怎么称呼它).到目前为止,我一直很舒服地使用我的Actor中的状态并在我的接收方法中改变它.快乐的时光!现在我想把我的演员分配到几个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)
  }
}
Run Code Online (Sandbox Code Playgroud)

删除状态:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

国家在哪里进入第二个版本的例子?

Eri*_*ner 6

从概念上讲,状态是在执行堆栈上.Receive是一个类型的别名PartialFunction.该start方法的实现中的部分函数关闭lst参数.然后,可以使用来自执行上下文的参数值按需评估接收行为.

因此,lst每次调用start方法时,大小确实会增长.

关于泄漏内存,请注意默认情况下become是unnested,因此没有内存泄漏.只有当你传递falsediscardOld参数,从而为未来的unbecome,能有一个内存泄漏的问题.