Поведение руководителей - PullRequest
0 голосов
/ 03 мая 2011

при реализации супервизора. Если в модуле супервизора я делаю что-то вроде

init ([_]) ->
{ok,
{{one_for_one,5, 60},
[{reverese, {reverse, start_reverse, []}, перманент, brutal_kill, worker, []}]}}.

и обратная функция:

start_reverse () ->
Pid = spawn (? MODULE, reverse, []).

Не будет работать, так как функция start_reverse обычно выходит в каждомдело.Однако, когда я добавляю строку, подобную этой:

start_reverse () ->
Pid = spawn (? MODULE, reverse, []),
{ok, Pid}.

Работает, даже если функция также работает нормально.Может кто-нибудь объяснить, почему?

Ответы [ 2 ]

5 голосов
/ 03 мая 2011

Легко,

Проблема в том, что supervisor требуется специальное соглашение о вызовах для поддержки завершения и инициализации процессов.Ваш код с низким уровнем spawn игнорирует это соглашение.Вы должны либо

  • использовать поведение gen_something, gen_server является наиболее распространенным.
  • порождать процесс, используя proc_lib
  • Использовать supervisor_bridge

В противном случае ваш код вообще не будет использовать OTP.И ты хочешь это.

1 голос
/ 03 мая 2011

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

Функция запуска должна создавать и связывать с дочерним процессом и возвращать {ok, Child} или {ok, Child, Info}, где Child - это pid дочернего процесса, а Info - произвольный термин, который игнорируется супервизор.

что является причиной того, что когда вы вернулись {ok, Pid}, это сработало ..

...