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, []).
È stato utile?

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.

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