Одна вещь, которой вы можете воспользоваться, это trapExit, case Exit и exit, system.В вашем главном субъекте вы можете установить для trapExit значение true:
// Foreman
def act() {
trapExit = true
link(workerA)
link(workerB)
...
}
Это означает, что ваш актер прораб получит сообщение о выходе, когда рабочий процесс завершится, включая причину:
// Foreman
def act() {
....
loop { react {
case Exit (worker: Actor, reason: AnyRef) => {
// decrement counter, or list of workers, and exit if empty
}
...
}}
}
Вы можете сопоставить шаблон по параметру причины.Например, в своем рабочем классе вы можете выйти, используя различные классы дел, указывающие, что должен делать мастер:
// Worker:
exit(WorkComplete)
exit(Emergency)
и т. Д. И т. Д.Когда ваш работник генерирует исключение, он завершает работу и отправляет связанному процессу сообщение Exit, содержащее исключение.Учитывая такие вещи, вы можете получить что-то вроде:
// Foreman
def act() {
....
loop { react {
case Exit (worker: Actor, reason: WorkComplete) => {
// decrement counter, or list of workers, and exit if empty
}
case Exit (worker: Actor, reason: TasksExhausted) => {
// log something, or make shut down worker if too many are exhausted
}
case Exit (worker: Actor, reason: Exception) => {
// log the exception, then restart the actor
}
...
}}
}
Из вашего первоначального вопроса неясно, хотите ли вы, чтобы рабочие продолжали работать, даже когда они закончили, пока прораб не скажет им, что онидолжен выйти, когда придет время.Если это так, отправка рабочим сообщений, в которых говорится, что они «заканчивают работу», работает, и вы можете сказать, что они закончили, используя механизм trapExit.
Надеюсь, это подстегнет интересное решение!