Non è possibile generare un soprintendente Erlang dalla shell
-
03-10-2019 - |
Domanda
Ho implementato un gen_server e supervisore: test_server
e test_sup
. Voglio testarli dal guscio / CLI. Ho scritto le loro funzioni start_link
in modo tale che i loro nomi sono registrati a livello locale.
ho trovato che posso deporre le uova il test_server
dalla riga di comando più che bene, ma un test_sup
generato non mi permette di interagire con il server a tutti.
Per esempio, io può generare un test_server
eseguendo:
1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]
I può interagire con il server, e tutto sembra bene.
Tuttavia, se cerco di fare la stessa cosa con test_sup
, non nuovi nomi / PID sono registrati nel mio "processo CLI" (usando registered/0
). Il mio test_server
sembra essere stato generato, ma non può interagire con essa (vedi il commento di Lukas Larsson su SASL per vedere perché questo è vero).
mi piacerebbe assumere ho codificato un errore nel mio supervisore, ma questo metodo di iniziare il mio supervisore funziona perfettamente bene:
1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]
Perché è che io posso generare un gen_server ma non un supervisore?
Aggiorna
Il codice che sto utilizzando può essere trovato in questo post . Sto usando echo_server
e echo_sup
, due moduli molto semplici.
Dato che il codice, questo funziona:
spawn(echo_server, start_link, []).
E questo non:
spawn(echo_sup, start_link, []).
Soluzione 2
Questa spiegazione è stata data da Bernard Duggan sulla Erlang domande mailing list :
processi legati non lo fanno automaticamente morire quando un processo cui sono legati uscite con il codice 'normale'. Ecco perchè [Echo_server] non esce quando il generando processo esce. Allora perché fa il dado superiore? Gli interni di i moduli supervisore sono infatti si implementato come gen_server, ma con process_flag (trap_exit, true) set. Il risultato di questo è che quando il stampi processo genitore, terminate () ottiene chiamato (cosa che non accade quando trap_exit è disabilitata) e il supervisore si spegne. Ha senso nel contesto di un supervisore, poiché un supervisore è generato dal suo genitore in un albero di supervisione - se non lo ha fatto die ogniqualvolta sua chiusura principale, Qualunque sia la ragione, si avrebbe penzoloni "rami" dell'albero.
Altri suggerimenti
Ogni volta che cercando di capire queste cose di solito è molto utile per accendere SASL.
applicazione:. Avvio (SASL)
In questo modo si spera arrivare a conoscere il motivo per cui supervisore sta terminando.