2014-01-18 2 views
0

Я относительно новый актер Скала. У меня огромная карта, которая сгруппирована в более мелкие блоки и выполняется через актеров. Основываясь на размере карты, количество созданных актеров меняется. Актеры работают хорошо, и процесс завершен. Но как проверить статус сгенерированных актеров? В java я знаком с использованием сервисов-исполнителей потоков. В Scala, как это делается?Как проверить статус актеров Scala от основного процесса?

ответ

4

Есть несколько способов сделать то, что вы хотите:

  1. Попросите работника актер отправить сообщение обратно отправителю, чтобы информировать его о том, что операция завершена. Каждый актер имеет ссылку на участника-отправителя (тот, который отправил сообщение), который вы можете использовать для отправки сообщения о завершении. Затем отправитель может обработать это сообщение.

  2. Вместо того чтобы посылать сообщение через tell (например actor ! msg), использовать ask, который возвращает Future. Вы можете настроить обратный вызов в Будущем, который запускается после завершения.

  3. Если артисты-актеры запущены для одноразовой операции, прекратите ее, остановив ее после завершения операции. Родительский актер (тот, который создал рабочего-актера) может контролировать работника с помощью механизма DeathWatch, который информирует родителя о прекращении действия дочернего актера. В этом подходе завершение означает, что операция завершена. Тем не менее, вам нужно будет отслеживать количество выплат, которые получает родитель, чтобы определить, когда закончились все работники.

Какой подход к использованию зависит от вашего варианта использования и характера операций. Наиболее распространенный и гибкий подход - №1. Пример (не проверен):

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 
    } 
    } 
} 
+0

Как вы называете ParentActor? Что делать, если ParentActor вызывается дважды? – kenlz

Смежные вопросы