Scala 在一个参与者完成其工作后终止所有其他参与者
我对scala和akka还很陌生。我想知道,一旦一个演员完成了他的工作,他会终止所有其他演员 代码的基本结构如下所示。有一名主管负责5名工人,这些工人由RoundRobinPool生成。每个工人都在做一些工作,并将结果发送回船长。我需要意识到的是,一旦其他工人中的一个完成了工作,就让主人终止所有其他工人的工作,并将其送回主人。然后,主程序将向主函数发送一些相对值,然后整个程序终止 你知道如何实现这一点吗Scala 在一个参与者完成其工作后终止所有其他参与者,scala,akka,actor,Scala,Akka,Actor,我对scala和akka还很陌生。我想知道,一旦一个演员完成了他的工作,他会终止所有其他演员 代码的基本结构如下所示。有一名主管负责5名工人,这些工人由RoundRobinPool生成。每个工人都在做一些工作,并将结果发送回船长。我需要意识到的是,一旦其他工人中的一个完成了工作,就让主人终止所有其他工人的工作,并将其送回主人。然后,主程序将向主函数发送一些相对值,然后整个程序终止 你知道如何实现这一点吗 //Code: object X{ sealed trait Message
//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
}
}
Akka的一个主要监管方面是,一个特定的演员被认为对其子女负责。在这种情况下,这意味着“大师”演员的死亡将自动导致其所有子演员的终止,因此您真正需要做的就是让“大师”演员自行终止。这可以通过多种方式实现,例如通过
Kill
或toxingpill
消息本身-例如,添加一行:self!将TotalResult
消息发送回calculateSender
后,立即服用毒药
请注意,在您在代码中描述的特定场景中,您设置为在main中接收结果的未来,但不包括对该结果的任何处理(例如,onComplete
调用,或使用Wait
)。在这样的处理过程中,您可以包括对system.shutdown()
的调用,而不是让“Master”自行终止,然后作为关闭过程的一部分终止所有参与者-只需确保只有在将来(以及参与者背后的工作)完成后才调用它
PS:有关终止演员的不同方式之间的差异的更多信息,请参见。Akka的一个主要监管方面是,特定演员被视为对其子女负责。在这种情况下,这意味着“大师”演员的死亡将自动导致其所有子演员的终止,因此您真正需要做的就是让“大师”演员自行终止。这可以通过多种方式实现,例如通过Kill
或toxingpill
消息本身-例如,添加一行:self!将TotalResult
消息发送回calculateSender
后,立即服用毒药
请注意,在您在代码中描述的特定场景中,您设置为在main中接收结果的未来,但不包括对该结果的任何处理(例如,onComplete
调用,或使用Wait
)。在这样的处理过程中,您可以包括对system.shutdown()
的调用,而不是让“Master”自行终止,然后作为关闭过程的一部分终止所有参与者-只需确保只有在将来(以及参与者背后的工作)完成后才调用它
PS:有关终止演员的不同方式之间的差异的更多信息,请参阅。感谢您的回复。正如你所说,我尝试过杀死大师,虽然结果很好,但终端上也显示,剩余的作品信息没有传递给大师。我意识到这是由于主演员的终止,但这个警告只是恼人。有什么办法可以消除这种情况吗?@ChenChen如果你说的是关于发送到死信队列的邮件的警告,因为预期的收件人已经死亡,我很确定有一个设置可以控制这些邮件的记录(我认为记录的邮件甚至提到了这一点)。一般来说,我认为这样的消息相对无害,可能只是有助于偶尔调试更严重的问题。是的,你是对的。我检查了文档,它说这可以通过添加:akka{log dead letters during shutdown=on}
来完成。我是否将其放在导入行或sbt之后?这通常通过传递到ActorSystem
初始化的配置来处理-有关详细信息,请参阅。感谢您的回复。正如你所说,我尝试过杀死大师,虽然结果很好,但终端上也显示,剩余的作品信息没有传递给大师。我意识到这是由于主演员的终止,但这个警告只是恼人。有什么办法可以消除这种情况吗?@ChenChen如果你说的是关于发送到死信队列的邮件的警告,因为预期的收件人已经死亡,我很确定有一个设置可以控制这些邮件的记录(我认为记录的邮件甚至提到了这一点)。一般来说,我认为这样的消息相对无害,可能只是有助于偶尔调试更严重的问题。是的,你是对的。我检查了文档,它说这可以通过添加:akka{log dead letters during shutdown=on}
来完成。我是否将其放在导入行或sbt之后?这通常通过传递到ActorSystem
初始化的配置来处理-有关详细信息,请参阅。