如何从主进程检查scala参与者的状态?

如何从主进程检查scala参与者的状态?,scala,akka,actor,Scala,Akka,Actor,我是相对较新的Scala演员。我有一张巨大的地图,它被分成更小的块,并通过演员来执行。根据地图大小,创建的参与者数量会有所不同。演员们工作得很好,整个过程也完成了。但是如何检查生成的参与者的状态呢?在java中,我熟悉线程池执行器服务的使用。在Scala中,这是如何实现的 有多种方法可以满足您的需求: 让工作者参与者将消息发送回发送者,通知其操作已完成。每个参与者都有一个对发送者参与者(发送消息的参与者)的引用,您可以使用该引用发回完成消息。然后发送者可以处理该消息 使用ask,返回一个未来,而

我是相对较新的Scala演员。我有一张巨大的地图,它被分成更小的块,并通过演员来执行。根据地图大小,创建的参与者数量会有所不同。演员们工作得很好,整个过程也完成了。但是如何检查生成的参与者的状态呢?在java中,我熟悉线程池执行器服务的使用。在Scala中,这是如何实现的

有多种方法可以满足您的需求:

  • 让工作者参与者将消息发送回发送者,通知其操作已完成。每个参与者都有一个对发送者参与者(发送消息的参与者)的引用,您可以使用该引用发回完成消息。然后发送者可以处理该消息

  • 使用
    ask
    ,返回一个
    未来
    ,而不是通过
    tell
    (例如
    actor!msg
    )发送消息。您可以在将来设置一个在完成时运行的回调

  • 如果为一次性操作启动辅助角色,请在操作完成后停止它,使其自行终止。父参与者(创建工作者参与者的参与者)可以通过
    DeathWatch
    机制监控工作者,该机制在子参与者终止时通知父参与者。在这种方法中,终止意味着操作已经完成。但是,您需要跟踪父级接收的终止数量,以确定所有工作角色何时完成

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

    case类PerformWork(i:Int)
    案例对象一
    类ParentActor(大小:Int)扩展了Actor{
    为了{
    结果+=1
    如果(结果==大小){
    //工作完成了
    }
    }
    }
    }
    类工作者扩展了参与者{
    def接收={
    案例m:PerformWork=>{
    //做些工作
    // ...
    发信人!工作电话
    }
    }
    }
    
    有多种方法可以满足您的需求:

  • 让工作参与者将消息发回给发件人,通知其操作已完成。每个参与者都有一个对发件人参与者(发送消息的参与者)的引用,您可以使用该引用发回完成消息。然后,发件人可以处理该消息

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

  • 如果为一次性操作启动工作参与者,则在操作完成后,让其通过停止来终止自身。父参与者(创建工作参与者的参与者)可以通过
    DeathWatch
    机制监控工作者,该机制在子参与者终止时通知父参与者。在这种方法中,终止意味着操作已完成。但是,您需要跟踪父参与者收到的终止数量,以确定所有工作者参与者何时完成

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

    case类PerformWork(i:Int)
    案例对象一
    类ParentActor(大小:Int)扩展了Actor{
    为了{
    结果+=1
    如果(结果==大小){
    //工作完成了
    }
    }
    }
    }
    类工作者扩展了参与者{
    def接收={
    案例m:PerformWork=>{
    //做些工作
    // ...
    发信人!工作电话
    }
    }
    }
    
    如何调用ParentActor?如果调用ParentActor两次怎么办?如何调用ParentActor?如果调用ParentActor两次怎么办?
    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
        }
      }
    }