Эрланг супервайзер и супервайзер ребенка - PullRequest
3 голосов
/ 28 января 2011

У меня есть вопрос о наблюдателе.Например, у меня есть 1 супервизор, и мне нужно выполнить start_child для этого супервизора.Должен ли я начать сначала начать мой руководитель?Или я могу только supervisor:start_child(my_sup,[]) без запуска my_sup?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 января 2011

Сначала вы создаете процесс супервизора как часть дерева наблюдения, вызывая supervisor:start_link/2 или supervisor:start_link/3.Созданный процесс супервизора вызывает Module:init/1, чтобы узнать о стратегии перезапуска, максимальной частоте перезапуска и дочерних спецификациях.

Это пример кода для супервизора, начинающего gen_server (хотя вы можете запуститьдругие модули gen_ *):

-module(ch_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
    supervisor:start_link(ch_sup, []).
init(_Args) ->
    {ok, {{one_for_one, 1, 60},
          [{ch3, {ch3, start_link, []},
            permanent, brutal_kill, worker, [ch3]}]}}.

Кортеж {ch3, ...} представляет собой дочернюю спецификацию , которая определяется следующим образом:

{Id, StartFunc, Restart, Shutdown, Type, Modules}

Дочерняя спецификация длязапуск сервера ch3 в приведенном выше примере выглядит следующим образом:

{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}

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

start_child/2 используется для динамического добавления дочерней спецификации к супервизору SupRef, который запускает соответствующий дочерний процесс.

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

0 голосов
/ 25 марта 2016

Да, вы должны сначала запустить супервизора, потому что вы не будете запускать ребенка, так как супервизор - тот, который запускает ребенка.Надеюсь, поможет.

...