Wie finde ich die Arbeiter in meiner Elixir-Anwendung?

8

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:

%Vor%

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:

%Vor%

Ich habe versucht, den Namen des Moduls direkt zu verwenden, aber das funktioniert auch nicht:

%Vor%

Es schlägt mit diesem Fehler fehl:

%Vor%

Der Code ist auf github verfügbar .

    
ijt 03.03.2015, 20:45
quelle

3 Antworten

7

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%     
Miroslav Prymek 04.03.2015, 08:18
quelle
6

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.

    
José Valim 04.03.2015 09:10
quelle
1

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!

    
Stratus3D 03.03.2015 23:49
quelle

Tags und Links