Обратный вызов супервизора для дочернего нормального выхода

Я создаю тестовое приложение, в котором есть один супервизор со стратегией simple_one_for_one и множество дочерних рабочих, динамически добавляемых к нему. Как реализовать обратный вызов (или получить сообщение) в супервизоре, который будет вызываться при обычном выходе ребенка?

Основная цель - уведомить какой-либо другой процесс о том, что все контролируемые рабочие процессы выполнены и пора показать окончательный отчет.

Как спроектировать такое поведение? Должен ли я создать свое собственное поведение, объединяющее супервизор и gen_server, или есть способ сделать это со стандартным поведением OTP?


person Aler    schedule 12.01.2011    source источник


Ответы (1)


Есть два способа сделать такое уведомление. Первый - просто следить за ребенком с самого начала. Используя erlang: monitor / 2, третья сторона может узнать, активен ли процесс или нет. Когда отслеживаемый процесс умирает, результат будет преобразован в сообщение, которое объяснит причину этого процессу мониторинга.

Другой способ - использовать отправку небольшого количества сообщения в функции terminate / 2 процесса (terminate / 3, если это gen_fsm). Это гораздо более непросто, потому что функция завершения не будет вызываться при любых обстоятельствах.

Вариант монитора намного лучше.

person I GIVE TERRIBLE ADVICE    schedule 12.01.2011
comment
Монитор - хороший момент. Но мне интересно, как ремонтировать рабочий процесс, если он вылетел, а затем перезапустился супервизором? После перезапуска у рабочего есть новый Pid, ​​и мне нужно каким-то образом передать этот новый Pid для мониторинга процесса. - person Aler; 12.01.2011
comment
2 способа. Либо вы используете реестр имен (например, global или gproc, либо сворачиваете свой собственный) и регистрируете каждый процесс, либо вам нужно сделать их временными и попросить третью сторону обрабатывать перезапуск за вас, чтобы они могли получить доступ к PID и настроить монитор. - person I GIVE TERRIBLE ADVICE; 13.01.2011