Erlang Supervisor: Wie überprüft man, ob alle Arbeiter geantwortet haben

8

Ich habe einen Supervisor mit N Worker-Prozessen. Wie üblich kann der Supervisor eine Nachricht an einen Arbeitsprozess senden und es gibt eine handle_cast , die eine Antwort von einem Arbeiter an den Supervisor sendet.

Wie kann ich überprüfen, dass genau alle N Mitarbeiter dem Supervisor geantwortet haben? Ist es möglich, dies bei jeder Art von Ereignisbehandlung zu implementieren - dh dem Vorgesetzten zu sagen "Ok, jeder hat geantwortet" und den Vorgesetzten nicht jede Sekunde in irgendeiner Art von ETS nach dem Status "Alle N Prozesse haben geantwortet" zu suchen Kinderregister-Tabelle?

    
skanatek 20.09.2011, 08:21
quelle

2 Antworten

8

Wenn Sie über ein OTP supervisor sprechen, nein, können Sie keine Nachricht an einen Mitarbeiter senden. Ein Supervisor ist ein sehr eingeschränktes Verhalten zum Zweck des Startens , Überwachens , Neustarten und Beendens Prozesse. Sonst nichts.

Um Ihr spezielles Problem zu lösen, müssten Sie also einen Prozess haben, der für das Senden einer Nachricht an alle Mitarbeiter verantwortlich ist. Dieser Prozess könnte auch eine Liste aller Arbeiter in seinem Zustand führen, die Arbeiter, die geantwortet haben, abhaken (oder von der Liste entfernen). Sie können dies mit einer Liste von PIDs erreichen und Antworten von den Prozessen erhalten (oder indem Sie die Prozesse mit erlang:monitor/2 überwachen, wenn sie beendet werden, wenn sie fertig sind) und sehen, wer übrig ist.

    
Adam Lindberg 20.09.2011, 08:52
quelle
3

Eine Alternative - die für Ihren Fall gelten könnte (oder nicht), ist die Verwendung des gen_event Verhalten.

DISCLAIMER

Ich sage " könnte ", weil es davon abhängt, was Ihre "Arbeiter" in Ihrem speziellen Fall tun. Wenn Sie sich für den Inhalt ihrer Antworten interessieren, möchten Sie vielleicht nicht diesen Ansatz verwenden, sondern nur, wenn alle Arbeiter ihre Aufgaben erledigt haben - zum Beispiel die Worker-Prozesse, die einige Berechnungen durchführen und speichern Sie ihr Teilergebnis in einer Datenbank, so dass Sie bereit sind, die Partialtöne zu kombinieren - das gen_event könnte der Weg sein, den Sie gehen sollten.

ENDE DES DISCLAIMERS

Also ...

In OTP ist ein Ereignismanager ein benanntes Objekt, an das Ereignisse gesendet werden können.

Ereignisse sind Nachrichten.

Im Ereignismanager sind null, ein oder mehrere Ereignishandler installiert. Wenn der Ereignismanager über ein Ereignis benachrichtigt wird, wird das Ereignis von allen installierten Ereignishandlern verarbeitet.

Im Grunde haben Sie statt eines Supervisors und mehrerer Mitarbeiter einen Event-Manager und mehrere Event-Handler.

Sie können dann die Funktion gen_event: sync_notify / 2 verwenden:

  

sync_notify ist synchron in dem Sinne, dass es nachher ok zurückgibt   Das Ereignis wurde von allen Ereignishandlern verarbeitet.

Weitere Informationen zum * gen_event * finden Sie hier und dort .

    
Roberto Aloi 22.09.2011 13:15
quelle

Tags und Links