Gibt es in Erlang eine Möglichkeit, dass der Absender einer Nachricht auf eine Antwort warten kann?

9

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?

    
Zubair 22.02.2010, 17:27
quelle

5 Antworten

21

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.

    
I GIVE TERRIBLE ADVICE 22.02.2010, 19:38
quelle
4

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.

    
Roberto Aloi 22.02.2010 18:04
quelle
4

Wenn der Empfangsprozess ein gen_server ist, können Sie gen_server:call verwenden. Zum Beispiel:

%Vor%     
legoscia 22.02.2010 18:10
quelle
2

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?

    
rvirding 23.02.2010 22:01
quelle
-6

hängt nur von den Situationen ab jldupont. Wenn ein Webbrowser eine Anfrage an webmachine für eine lang andauernde erlang-Ressource sendet, gibt es keine Möglichkeit, einen Cast zu verwenden, um diese Anfrage zu erfüllen.

    
blah 22.02.2010 21:34
quelle

Tags und Links