Domanda

Quando si implementa un supervisore .. se, nel modulo supervisore, faccio qualcosa di simile

init ([_]) ->
{ok,
{{one_for_one, 5, 60},
{reverese, {reverse, start_reverse, []}, permanente, brutal_kill, lavoratore, []}]}}.

E la funzione inversa è:

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

Non funzionerà poiché la funzione start_reverse esce normalmente in ogni caso. Tuttavia, quando aggiungo una riga come questa:

start_reverse () ->
Pid = spawn (? Module, reverse, []),
{OK, PID}.

Funziona, anche quando la funzione esce normalmente. Qualcuno può spiegare perché?

È stato utile?

Soluzione

In realtà .. non è davvero necessario che il processo del bambino supervisore sia un gen_server. Il supervisore documentazione lo menziona specificamente

La funzione iniziale deve creare e collegarsi al processo figlio e dovrebbe restituire {ok, figlio} o {ok, figlio, info} in cui il bambino è il PID del processo figlio e informazioni un termine arbitrario che viene ignorato dal supervisore.

Questo è il motivo per cui quando sei tornato {ok, Pid} ha funzionato..

Altri suggerimenti

Facilmente,

Il problema è che il supervisor Ha bisogno di una convenzione di chiamata specifica per supportare l'arresto e l'inizializzazione dei processi. Il tuo codice a basso livello spawn Ignora questa convenzione. Dovresti neanche tu

  • Usa un comportamento gen_something, gen_server è più comune.
  • Spawn il processo usando proc_lib
  • Usare un supervisor_bridge

Altrimenti, il tuo codice non trarrà vantaggio di OTP. E tu lo vuoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top