Сначала вы создаете процесс супервизора как часть дерева наблюдения, вызывая 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
, который запускает соответствующий дочерний процесс.
Таким образом, супервизор всегда запускается первым, затем его дочерние процессы запускаются автоматически или вручную на основе стратегий перезапуска .