Эрланг: каскадные супервайзеры? - PullRequest
1 голос
/ 03 декабря 2009

Можно ли каскадировать супервизоры внутри приложения?

например. supervisor sup1 порождает дочерний процесс, который создает supervisor sup2?

Ответы [ 3 ]

7 голосов
/ 03 декабря 2009

Вы, вероятно, хотите добавить ребенка в качестве супервизора.

Это запись в дочерней спецификации ребенка супервизора. «Тип» ребенка может быть установлен на «супервизор»:

http://www.erlang.org/doc/design_principles/sup_princ.html#spec

Вероятно, вы можете сделать это через ребенка, начинающего самого супервизора, но это по меньшей мере менее изящно и менее очевидно, что вы делаете.

НТН, ч.

3 голосов
/ 03 декабря 2009

Да, вы можете просто добавить супервизоров в качестве дочерних. Или смешивать и сочетать. Обычно я делаю что-то вроде этого:

(в моем руководителе высшего уровня)

init([]) ->
    Args = [],
    ModuleArray = [get_info(Module, Args)
           || Module
              <- [emx_nodestate, emx_sup_data, emx_sup_util, emx_sup_api,
                  emx_flow]],
    {ok, {{one_for_one, 3, 1}, ModuleArray}}.

get_info(Module, Args) ->
    {Module, {Module, start_link, [Args]}, permanent, 10000,
     worker, [Module]}.

И тогда что-то вроде emx_sup_data (супервизор поведения) содержит:

init([]) ->
    Args = [],
    ModuleArray = [get_info(Module, Args)
           || Module <- [job_housekeep]],
    {ok, {{one_for_all, 3, 1}, ModuleArray}}.

get_info(Module, Args) ->
    {Module, {Module, start_link, [Args]}, permanent, 10000,
     worker, [Module]}.

и что-то вроде emx_nodestate (поведение gen_server)

init([]) ->
    {ok, #state{status=starting, interested=[]}}.

Работает как сон ...!

2 голосов
/ 03 декабря 2009

Чтобы увидеть, как другие люди структурируют свои приложения, почему вы не запускаете оболочку и не запускаете панель инструментов:

toolbar:start()

Это дает вам графическое представление иерархии руководителя. Беглый взгляд на дерево супервизора ядра (mnesia или yaws) покажет вам, как выглядит «нормальное» дерево супервизора.

Вы составляете приложение подсистем, контролируемых руководителем приложения. Каждая подсистема может быть множеством подсистем под наблюдателем подсистемы (продолжайте применять шаблон рекурсивным функциональным образом, пока не закончится детализация ...)

...