Durch den Supervisor und die Anwendung finden Sie einen Teil der ersten Schritte Tutorial, ich schreibe einen Komponententest für das Supervision-Tree-Problem an der Unterseite. Ich habe versucht, den Supervisor der obersten Ebene zu starten, aber es ist mit diesem Fehler fehlgeschlagen:
%Vor% Offensichtlich ist die App bereits gestartet, also muss ich auf ihre Arbeitsprozesse zugreifen. Ich könnte Supervisor.which_children verwenden, um sie zu bekommen, wenn ich den Supervisor hätte. Um das zu bekommen, würde es vielleicht helfen, die laufende kv
-Anwendung zu haben:
So, jetzt habe ich die PID für die App. Gibt es eine Möglichkeit, den Root-Supervisor-Prozess von diesem zu erhalten, oder muss ich ihn manuell irgendwo registrieren, um von dem Test zu bekommen?
Oder gibt es eine Möglichkeit, die Arbeiter direkt von ihren Namen zu befreien? Ich habe :erlang.whereis
versucht, aber den Worker nicht gefunden:
Ich habe versucht, den Namen des Moduls direkt zu verwenden, aber das funktioniert auch nicht:
%Vor%Es schlägt mit diesem Fehler fehl:
%Vor%Sie können KV.Registry nicht finden, da in Ihrem Code ein Tippfehler enthalten ist. Du rufst an:
%Vor%aber die Definition ist:
%Vor%Sie übergeben [name: KV.Registry] als buckets_supervisor, opts ist [] und Ihr Worker ist daher nicht unter dem Namen KV.Registry registriert.
Probieren Sie diesen Patch: Ссылка
%Vor%Wenn Sie den Supervisor starten, der ihm einen Namen gegeben hat, können Sie alle Arbeiter mit:
erreichen %Vor% Wahrscheinlich werden Sie versuchen, zwei worker(GenEvent, ...)
zu starten, und sie werden doppelte Ereignisse haben. Wenn Sie die Option :id
explizit übergeben, wird dies wahrscheinlich behoben.
Nach dem Klonen Ihres Repos habe ich mich umgesehen. Ich konnte die Anwendung nicht starten. Normalerweise können Elixir-Anwendungen über die Befehlszeile gestartet werden, indem Sie Folgendes ausführen:
%Vor%Aber als ich Ihre Anwendung ausgeführt habe, habe ich den folgenden Fehler erhalten:
%Vor% Dies bedeutet, dass Ihre Anwendung in lib/kv.ex
in Zeile 5 einen Supervisor namens KV.Supervisor
aufruft. Ich habe mir Ihren Code angeschaut und kein Modul hat diesen Namen, aber ich sehe, dass Sie das Supervisor-Verhalten mit dem Namen KV.Bucket.Supervisor
verwenden.
Sie müssen entweder ein Modul mit dem Namen KV.Supervisor
definieren, das das Supervisor-Verhalten implementiert, oder Zeile 5 in lib/kv.ex
aktualisieren, so dass KV.Bucket.Supervisor.start_link
anstelle von KV.Supervisor.start_link
aufgerufen wird.
Sobald Sie das tun, sollten Sie in der Lage sein, alle Prozesse, die der Supervisor überwacht, zu erhalten, indem Sie Folgendes aufrufen:
%Vor%Hoffe, das hilft!