Frage

test_server und test_sup:

Ich habe ein gen_server und Supervisor umgesetzt. Ich möchte, dass sie von der Shell / CLI testen. Ich habe ihre start_link Funktionen geschrieben, so dass ihre Namen lokal registriert sind.

Ich habe festgestellt, dass ich die test_server von der Kommandozeile erzeugen kann ganz gut, aber ein gelaicht test_sup erlaubt mich nicht mit dem Server überhaupt zu interagieren.

Zum Beispiel kann ich ein test_server laichen durch Ausführen:

1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]

Ich kann mit dem Server interagieren, und alles scheint in Ordnung.

Allerdings, wenn ich versuche, das gleiche mit test_sup zu tun, keine neuen Namen / Pids in meinem „CLI-Prozess“ registriert ist (unter Verwendung von registered/0). Mein test_server erscheint worden hervorgebracht zu haben, aber ich kann nicht mit ihm interagieren (siehe Lukas Larsson Kommentar über SASL zu sehen, warum dies der Fall ist).

Ich würde davon ausgehen, ich einen Fehler in meinen Vorgesetzten codierte, aber diese Methode meinen Vorgesetzter des Beginnens funktioniert völlig in Ordnung:

1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]

Warum ist es, dass ich ein gen_server laichen kann aber keinen Supervisor?


Aktualisieren

Der Code Ich verwende in diesem Beitrag . Ich verwende echo_server und echo_sup, zwei sehr einfachen Modulen.

dieser Code gegeben, dies funktioniert:

spawn(echo_server, start_link, []).

und dies nicht:

spawn(echo_sup, start_link, []).
War es hilfreich?

Lösung 2

wurde diese Erklärung von Bernard Duggan auf der Erlang Fragen Mailingliste :

Verknüpfte Prozesse nicht automatisch sterben, wenn ein Prozess, den sie gebunden sind Ausfahrten mit dem Code 'normal'. Deshalb [Echo_server] nicht beendet, wenn die Laichen Prozess beendet wird. Warum also tut die Supervisor sterben? Die Interna die Überwachungsmodul sind in der Tat selbst umgesetzt als gen_server, aber mit process_flag (trap_exit, true) gesetzt. Das Ergebnis davon ist, dass, wenn die Eltern-Prozess Gesenke, terminate () erhält genannt (was nicht geschieht, wenn trap_exit ist deaktiviert) und das Supervisor schaltet ab. Es ergibt Sinn im Rahmen eines Supervisors, da ein Supervisor wird von der Mutter gelaicht in einer Aufsicht Baum - wenn es so wäre nicht sterben, wenn die Mutter shutdown, was auch immer der Grund ist, müssten Sie „Zweige“ des Baumes baumeln.

Andere Tipps

Jedes Mal, wenn versucht, diese Dinge herauszufinden es in der Regel sehr hilfreich ist auf SASL zu wechseln.

Anwendung:. Start (SASL)

So können Sie hoffentlich wissen bekommen, warum Sie Supervisor beendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top