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é?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top