Вопрос

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

инициализация([_]) ->
{хорошо,
{{one_for_one, 5, 60},
[{reverese, {обратный, start_reverse, []}, постоянный, brutal_kill, рабочий,[]}]}}.

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

start_reverse() ->
Pid=spawn(?МОДУЛЬ,обратный,[]).

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

start_reverse() ->
Pid=порождение(?МОДУЛЬ,обратный,[]),
{ок,Pid}.

Это работает, даже когда функция завершается обычным образом.Кто-нибудь может объяснить почему?

Это было полезно?

Решение

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

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

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

Другие советы

Легко,

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top