Поведение супервайзеров
-
28-10-2019 - |
Вопрос
при внедрении супервайзера..Если в модуле 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.И ты этого хочешь.