Comportamiento de supervisores
-
28-10-2019 - |
Pregunta
Al implementar un supervisor ... si, en el módulo de supervisor, hago algo como
init ([_]) ->
{OK,
{{one_for_one, 5, 60},
{Reverese, {reverse, start_reverse, []}, permanente, brutal_kill, trabajador, []}]}}.
y la función inversa es:
start_reverse () ->
Pid = spawn (? Módulo, reverso, []).
No funcionará ya que la función START_REVEVE se sale normalmente en todos los casos. Sin embargo, cuando agrego una línea como esta:
start_reverse () ->
Pid = spawn (? Módulo, reverso, []),
{OK, PID}.
Funciona, incluso cuando la función sale normalmente también. ¿Alguien puede explicar por qué?
Solución
En realidad ... no es realmente necesario que el proceso de niño supervisor sea un gen_server
. El supervisor documentación menciona específicamente que
La función de inicio debe crear y vincular al proceso del niño, y debe devolver {OK, Child} o {Ok, Child, Info} donde el niño es el PID del proceso del niño y la información es un término arbitrario que el supervisor ignora.
¿Cuál es la razón por la cual cuando regresaste? {ok, Pid}
funcionó..
Otros consejos
Fácilmente,
El problema es que el supervisor
Necesita una convención de llamadas específica para respaldar el cierre y la inicialización de los procesos. Su código con un nivel bajo spawn
ignora esa convención. Deberías
- Use un comportamiento gen_something,
gen_server
es el más común. - Generar el proceso usando
proc_lib
- Utilizar una
supervisor_bridge
De lo contrario, su código no aprovechará en absoluto OTP. Y lo quieres.