我对scala和akka很新。我想知道一旦演员完成其工作,就会终止所有其他演员。
代码的基本结构如下。有一个Master负责5名工人,由RoundRobinPool生成。每个工人都在做一些工作,并将结果发回给师父。我需要意识到的是,一旦其中一个工人完成工作并将其发回给主人,让主人终止所有其他工人。然后,主机将向主函数发送一些相对值,然后整个程序终止。
知道如何实现这个吗?
//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
}
}
答案 0 :(得分:0)
Akka的主要监督方面之一是,某个演员被视为对其子女负责。在这种情况下,这意味着“大师”演员的死亡将自动导致其所有孩子的终止,所以你真正需要做的就是让“大师”演员自行终止。这可以通过多种方式完成,例如通过Kill
或PoisonPill
消息发送给自己 - 例如,在发送self ! PoisonPill
后直接添加行TotalResult
消息回到calculateSender
。
请注意,在您在代码中描述的特定方案中,您设置为在main中接收结果的未来,但不包括任何处理(例如onComplete
调用或使用Await
)结果。在这样的处理过程中,您可以包含对system.shutdown()
的调用,而不是让“Master”终止自身,然后在关闭过程中终止所有actor - 只需确保在将来之后调用它(因而背后的演员努力)已经完成。
PS:有关终止演员的不同方式之间的差异的更多信息,请参阅this question。