Gibt es in Erlang eine Möglichkeit, dass ein Absender einer Nachricht auf eine Antwort warten kann, so dass die Ausführung erst fortgesetzt wird, nachdem die Nachricht verarbeitet wurde?
Und ich meine so etwas:
%Vor%Ich weiß, dass ein Callback durch Senden der PID des Absenders erfolgen kann, aber gibt es noch eine andere Möglichkeit zu warten?
Als erstes muss man verstehen, dass Erlang für die asynchrone Nachrichtenweiterleitung entwickelt wurde. Daher besteht die einzige Möglichkeit für die synchrone Nachrichtenübermittlung darin, etwas zu implementieren, das einer Bestätigung ähnelt.
Stellen Sie sich zwei Prozesse vor, P1 und P2. P1 könnte den folgenden Code ausführen:
%Vor%P2 könnte auf seiner Seite einfach folgendes ausführen:
%Vor% Dann könntest du p2 als neuen Prozess erstellen. Dieser wird auf jede Nachricht warten. Wenn Sie dann p1 aufrufen, sendet es eine Nachricht an P2, die es dann verarbeitet ( io:format/2
) und antwortet auf P1. Da P1 auf eine Antwort wartete, wurde in diesem Prozess kein zusätzlicher Code ausgeführt.
Das ist die grundlegende und einzige Möglichkeit, blockierende Aufrufe zu implementieren. Die Vorschläge zur Verwendung von gen_server:call
implementieren grob das, was ich gerade gezeigt habe. Es ist jedoch vor dem Programmierer verborgen.
Sie könnten einen Empfang -Block verwenden:
Lesen aus dem Dokument:
Empfangen schlägt nie fehl. Die Ausführung ist ausgesetzt, möglicherweise auf unbestimmte Zeit, bis eine Nachricht ankommt, die das tut Passen Sie eines der Muster und mit einem wahre Wachsequenz.
Mit anderen Worten, senden Sie eine Nachricht und warten Sie auf eine Antwort.
Wenn der Empfangsprozess ein gen_server ist, können Sie gen_server:call
verwenden. Zum Beispiel:
Nein, es wird nur eine asynchrone Nachricht übergeben.
Wenn Sie etwas philosophisch sein wollen, dann ist es sehr schwierig, automatisch zu definieren, wann eine Nachricht verarbeitet wurde. Ist die Nachricht bei dem Prozess angekommen, wurde sie empfangen, aber noch nicht bearbeitet oder zu irgendeinem Zeitpunkt, zu dem sie durch den Empfangsprozess bearbeitet wurde. Es ähnelt der automatischen Benachrichtigung, wenn jemand meine E-Mails "gelesen" hat. Ja, sie haben es gesehen, aber sie haben es wirklich gelesen?