Comportamento dei supervisori
-
28-10-2019 - |
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é?
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.