Вопрос

У меня есть иерархия процессов под названием «Monitor_node». Каждый из этих мониторов_нод контролируется одним руководителем. Теперь каждый из этих узлов может иметь сложную внутреннюю структуру. Значение, это может (или не может) иметь некоторые подпроцессы, которые необходимы для того, чтобы он был правильно управлять. Пример: процесс отправки сохраняющихся сообщений. До сих пор я использовал простой Spawn_Link, чтобы создать эти «внутренние» процессы.

Однако я понял, что неренение их в функции init of Monitor_node (который контролируется) иногда вызывает неудачу эту функцию (и поэтому целое дерево супервизора не удалось). Мой вопрос: будет ли это хорошее решение для прикрепления этих внутренних процессов для дерева супервизора? Я думаю об изменении Monitor_node к руководителю, который контролирует его внутренние процессы.

Мои сомнения:

  1. Мне пришлось бы контролировать довольно значительное количество очень маленьких процессов. Я не уверен, что это хорошая практика.

  2. Я не могу заранее знать, что данный «внутренний» процесс является простым процессом или имеет некоторую внутреннюю структуру (также порождает другие процессы). Если последний случай, то я, вероятно, должен прикрепить эти «внутренние» процессы для дерева супервизора.

    Я надеюсь, что я не путаю тебя слишком сильно. С нетерпением жду ответа.

    Редактировать:

    Очень похожее (если не то же самое) проблема обсуждается Здесь (3-й пост). Приведенный раствор в значительной степени такой же, как тот, который я даю дерьмовые ответы.

Это было полезно?

Решение

Supervisors:

There is a trick here, which includes the use of two supervisors. Your tree goes like:

main_sup -> worker
main_sup -> attached_pool_sup

attached_pool_sup -> workers

main sup is one_for_all, so if the worker or the pool supervisor dies, then the tree is done for and killed off. The pool supervisor is a simple_one_for_one which are suitable for having hundreds or thousands of workers.

Init:

Don't do too much work in your init callback. The supervisor will wait until the init completes and you can set a timeout (which you can increase in your case) if it takes longer than normal.

A trick is to quickly timeout (return with a timeout of 0 from init) and then handle additional setup in the handle_info timeout callback. That way you won't be stopping up the main supervisor. Beware of races here!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top