繁体   English   中英

如何在Scala Akka中找到父母演员

[英]How to find a parent actor in scala akka

我正在使用Scala Akka演员模型。 我有一个父演员创建n个子演员。 儿童演员首先互相交谈,然后将答案报告给主要演员。 但是我无法使其适用于报告部分。 代码结构如下:

class Master(n:Int) extends Actor{
    val system =ActorSystem("mysystem")
    for(i <- 1 to n){
        val child=system.actorOf(Props(new Node),name=i.toString) 
    }
    ... code let child actor talk with each other ...
    def receive={
        case _=>"received"
    }
}
class Node extends Actor{
    def receive={
        case => ... some code talking with each other...
                var master=context.actorSelection("../Master")
                master ! "talk back to master"
    } 
}
def main() {
    val Master=system.actorOf(Props(new Master(10)),name="Master")
}

让主服务器将其自引用传递给节点。 相关更改的行是:

... // In Master:
val child=context.actorOf(Props(new Node(self)),name=i.toString)
...
... // Definition of Node:
class Node(master: ActorRef) extends Actor{
...
//var master=context.actorSelection("../Master") - this line no longer required.
... //etc.

有什么理由为什么要创建新的ActorSystem? 通常,它仅创建一次,但是您已经有一个actor,这意味着您已经拥有一个系统,无需创建两次。 ActorSystem的重量特别重,它会分配线程,读取调度程序的配置,远程功能,地址等。除非有充分的理由,否则不要创建新的线程。

我建议删除ActorSystem的创建,在创建子actor时使用context而不是system 这样,您可以在Node使用context.parent来获得Master ,因为它是您所有孩子的主管。

此外,查询../Master选择一个同级而不是父级。 您可能想要..结果与context.parent完全相同,但是context.parent应该更快

尝试

val master = context.actorSelection("/user/Master")
master ! "talk back to master"

你也可能想看看这个条目的文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM