我很擅长使用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)
国家在哪里进入第二个版本的例子?
从概念上讲,状态是在执行堆栈上.Receive是一个类型的别名PartialFunction.该start方法的实现中的部分函数关闭lst参数.然后,可以使用来自执行上下文的参数值按需评估接收行为.
因此,lst每次调用start方法时,大小确实会增长.
关于泄漏内存,请注意默认情况下become是unnested,因此没有内存泄漏.只有当你传递false的discardOld参数,从而为未来的unbecome,能有一个内存泄漏的问题.
| 归档时间: |
|
| 查看次数: |
1639 次 |
| 最近记录: |