【问题标题】:Terminates all other actors once one actor finishes its work一个演员完成工作后终止所有其他演员
【发布时间】:2015-09-12 12:32:48
【问题描述】:

我对 scala 和 akka 很陌生。一旦其中一名演员完成工作,我想知道是否要终止所有其他演员。

代码的基本结构如下。有一个 Master 负责 5 个工人,这些工人是由 RoundRobinPool 生成的。每个工人都在做一些工作,并将结果发送回 Master。我需要意识到的是,一旦其中一个工作人员完成工作,让 Master 终止所有其他工作人员并将其发送回 Master。然后 master 会向 main 函数发送一些相对值,然后整个程序终止。

知道如何实现吗?

//Code:    
object X{
    sealed trait Message 
    case class Result() extends Message 
    case class Work() extends Message
    case class Result() extends Message 
    case class Totalresult() extends Message
    class Worker extends Actor{
        def receive={
           case Work =>
           sender ! Result}
    }//End of class Worker         
    class Master(nrOfWorkers: Int) extends Actor{
        val workerRouter =context.actorOf(RoundRobinPool(nrOfWorkers).props(Props[Worker]))) 
        def receive={
            case Calculate => calculateSender=sender                   
            case Result => calculateSender ! Totoalresult()
        }
    }//End of class Master  
    def main(args: String) {
       val system =ActorSystem("mysystem")
       val master=system.actorOf(Props(new Master(5),name="master")  
       val future=master ? Calculate
    }  
}

【问题讨论】:

    标签: scala akka actor


    【解决方案1】:

    Akka 的主要监督方面之一是给定的 Actor 被认为对其子代负责。在这种情况下,这意味着“Master”actor 的死亡将自动导致其所有子actor 终止,因此您真正需要做的就是让“Master”actor 自行终止。这可以通过多种方式完成,例如通过KillPoisonPill 消息给自身 - 例如,在将TotalResult 消息发送回calculateSender 之后直接添加行:self ! PoisonPill

    请注意,在您在代码中描述的特定场景中,您设置为在 main 中接收结果的未来,但不包括任何处理(例如,onComplete 调用,或使用 @987654329 @) 的结果。在此类处理中,您可以包括对system.shutdown() 的调用,而不是让“Master”自行终止,然后作为关闭过程的一部分终止所有参与者 - 只需确保仅在未来之后调用它(并且因此,它背后的演员努力)已经完成。

    PS:请参阅this question,了解有关终止演员的不同方式之间差异的更多信息。

    【讨论】:

    • 感谢您的回复。正如你所说,我已经尝试杀死掌握,虽然结果很好,但它也从终端说,其余的工作信息没有传递给主人。我意识到这是由于主演员的终止,但这个警告很烦人。有什么办法可以摆脱吗?
    • @ChenChen 如果您正在谈论由于预期收件人已经死亡而发送到死信队列的消息的警告,我很确定有一个设置可以控制这些消息的日志记录(我认为记录的消息甚至提到了这一点)。一般来说,我认为此类消息相对无害,并且可能只是帮助调试更严重的问题。
    • 是的,你是对的。我检查了它说这可以通过添加来完成的文档:akka {log-dead-letters-during-shutdown = on}。我是否只是将其放在导入行或 sbt 之后?
    • 这通常通过传递给 ActorSystem 初始化的配置来处理 - 请参阅 here 了解详细信息。
    猜你喜欢
    • 2015-05-06
    • 2016-10-20
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多