2016-03-31 8 views
1

Wenn ich eine Gruppe von Gen-Servern Sperre genannt, kann ich eine FunktionKann eine Funktion, die durch ihre in einem gen_server Prozess aufgerufen werden Pid

hello() -> io:format("Hello, world!~n").

vom Pid einzelner Prozesse dieser gen_server sagen nennen anstelle von generischen lock:hello().

Ich versuchte Pid=<0.91.0> (so ist die PID zurück, wenn ich ein chld in meinem Vorgesetzten), und Pid: Hallo(). gibt ein schlechtes Argument ist es unmöglich, dies zu tun?

Ist es eine bessere Idee, stattdessen eine Nachricht zu senden, um diese Funktion aufzurufen?

Antwort

6

können Sie rufen gen_server: Anruf (Pid, TuplePatternThatMatchesOnCallback)

-behaviour(gen_server). 

%% gen_server callbacks 
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, 
     terminate/2, code_change/3]). 

...

hello() -> 
    gen_server:call(Pid, hello). 


handle_call(hello, _From, _State) -> 
    Reply = io:format("Hello, world!~n") 
    {reply, Reply, State}. 

Es gibt keine Pid: Funktion API in Erlang.

In beiden Fällen serialisiert der Aufruf des Gen-Servers den Aufruf, sofern Sie die gen_server-API verwenden. Aber mit Funktionsaufruf können Sie synchrone Antwort wählen.

Wenn das hallo nur in gen_server module (ohne gen_server: call) platziert wird, wird es im Kontext des aufrufenden Prozesses ausgeführt, nicht gen_server one's.

1

Sie können die Funktion hello von überall aufrufen. Wenn Sie es 1000 Mal aus 1000 Prozessen aufrufen, führt jeder Prozess die Funktion parallel aus, ohne sich gegenseitig zu stören. Sie nennen es einfach so lock:hello(). von jedem dieser Prozesse, also rufen Sie eine spezifische Funktion hello, die in einem bestimmten Modul lock definiert ist und die Null Argumente.

Wahrscheinlich gibt es etwas, das Sie in Ihrer Frage nicht erwähnt haben?

3

Wenn Sie eine Funktion in einem gen_server-Modul aufrufen, wird die Funktion im gen_server-Prozess nicht ausgeführt. Es wird im aufrufenden Prozess ausgeführt.

Wenn Sie das gen_server Prozess, etwas tun wollen, sollten Sie die gen_server verwenden: Anrufe absetzen oder gen_server: Umsetzungsfunktionen:

Zum Beispiel die gen_server: Anruf/2-Funktion eine pid und eine Nachricht hinterlassen wird, dass wird zusammen mit dem Anruf gesendet. Der gen_server wird dann seine handle_call-Funktion im gen_server-Prozess ausführen.

Normalerweise würden Sie Funktionen in demselben Modul haben, das den gen_server definiert, der den Aufruf gen_server: durchführt, so dass der Anrufer sich nicht darum kümmern muss. Das erzeugt eine saubere API für andere und verbirgt die gen_serverspezifischen Sachen.

Es kann ein bisschen schwierig sein, alle Teile zusammen zu bekommen, aber es ist einfach, sobald Sie haben. Schauen Sie sich dieses Kapitel von LYSE an: http://learnyousomeerlang.com/clients-and-servers