2009-12-02 3 views

ответ

7

Возможно, вы захотите добавить ребенка в качестве наблюдателя.

Это запись в childspec ребенка супервизора. «Тип» ребенок может быть установлен в «смотрящий»:

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

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

HTH, h.

3

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

(в моем верхнем супервизора уровня)

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=[]}}. 

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

+0

Это именно то, что я имел в виду, говоря, что это не _quite_, что вы, возможно, захотите сделать. Возьмите дочерний элемент суперпользователя emx_sup_data. В своем childspec (как возвращен toplevelsupervisor: get_info/2) он определяется как дочерний тип типа «рабочий», в то время как на самом деле это, как вы сами утверждаете, «убеждения поведения наблюдателя». В этом случае лучше указать его как таковой в childspec супервизора верхнего уровня, установив Type = supervisor, а не рабочий. – haavee

+0

Да, вы, безусловно, правы, что его следует отмечать как супервизор, даже если это только хорошо для документации. Но этот параметр вообще не изменяет поведение супервайзера верхнего уровня - вышеупомянутый фрагмент - это реальное приложение, которое работает точно так, как вам нужно. В текущем выпуске OTP либо действительно действителен, и он упростил мой код выше, чтобы жестко закодировать их для рабочих ...! –

2

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

toolbar:start() 

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

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

+0

Спасибо за это предложение! – jldupont

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