如何从主进程检查scala actor状态?

时间:2014-01-18 09:37:53

标签: scala akka actor

我是相对较新的Scala演员。我有一个巨大的地图,它被分成更小的块并通过演员执行。根据地图大小,创建的演员数量会有所不同。演员运作良好,过程完成。但是如何检查生成的actor的状态?在java中,我熟悉线程池执行器服务的使用。在Scala中如何做到这一点?

1 个答案:

答案 0 :(得分:4)

有多种方法可以做你想做的事:

  1. 让工作人员向发件人发送一条消息,告知其操作已完成。每个actor都有一个对发送方actor(发送消息的actor)的引用,您可以使用它来发送完成消息。然后发件人可以处理该邮件。

  2. 使用tell,而不是通过actor ! msg发送消息(例如ask),而Future将返回DeathWatch。您可以在完成后运行的Future上设置回调。

  3. 如果为一次性操作启动了worker actor,请在操作完成后通过停止它来终止它自己。父actor(创建worker actor的那个)可以通过case class PerformWork(i: Int) case object WorkDone class ParentActor(size: Int) extends Actor { for (i <- 1 to size) { val actor = context.actorOf(Props[Worker], s"worker$i") actor ! PerformWork(i) } var result = 0 def receive = { case WorkDone => { result += 1 if (result == size) { // work is done } } } } class Worker extends Actor { def receive = { case m: PerformWork => { // do some work // ... sender ! WorkDone } } } 机制监视工作者,该机制在子actor终止时通知父项。在这种方法中,终止意味着操作已经完成。但是,您需要跟踪父级接收的终止次数,以确定所有工作人员何时完成。

  4. 使用哪种方法取决于您的使用案例和操作的性质。最常见和最灵活的方法是#1。示例(未测试):

    {{1}}