【问题标题】:How to find a parent actor in scala akka如何在 scala akka 中找到父演员
【发布时间】:2016-01-24 11:16:44
【问题描述】:

我正在使用 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")
}

【问题讨论】:

  • 这一行:`val child=system.actorOf(Props(new Node),name=i.toString)`应该是`val child=context.actorOf(Props(new Node),name =i.toString)`

标签: java scala akka actor


【解决方案1】:

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

... // 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.

【讨论】:

  • 已编辑 - 根据 @ViktorKlang 和 @Archeg 的 cmets/answer 将 system.actorOf 呼叫更改为 context.actorOf。好球,我错过了。
【解决方案2】:

你有什么理由创建新的 ActorSystem 吗?通常它只创建一次,但你已经有了一个actor,这意味着你已经有了一个系统,不需要创建两次。 ActorSystem 是非常重量级的,它分配线程、读取调度程序的配置、远程功能、地址等。你永远不应该创建一个新的,除非你有充分的理由这样做。

我建议删除 ActorSystem 的创建,在创建子 Actor 时使用 context 而不是 system。这样你就可以在你的Node 中使用context.parent 来获取Master,因为它是你所有孩子的监督者。

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

【讨论】:

    【解决方案3】:

    试试

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

    您可能还想查看文档中的this entry

    【讨论】:

    • 另一种解决方案是使用发件人参考来回答大师:发件人! “与主人对话”
    • 这种方法不适合我,因为这里的发送者将是另一个子节点而不是主节点。 @christophetd
    猜你喜欢
    • 2018-05-23
    • 2013-06-16
    • 2019-04-23
    • 2014-06-13
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多