2016-03-31 9 views
1

によってgen_serverプロセスで機能と呼ばれることができます総称の代わりにlock:hello().は、私はロックと呼ばれる世代のサーバーのグループを持っている場合は、私はそのgen_serverの個々のプロセスのPIDから</p> <p><code>hello() -> io:format("Hello, world!~n").</code></p> <p>を言う関数を呼び出すことができますそのはPid

私はPid=<0.91.0>(私は上司にchldを開始したときにPidを返す)とPid:hello()を試しました。悪い議論を与えるこれは不可能なのですか?

この関数を呼び出す代わりにメッセージを送信する方が良いでしょうか?

答えて

6

あなたはgen_serverを呼び出すことができますコール(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}. 

何でPidありません:Erlangで機能APIは。

どちらの場合でもgen_server APIを使用している場合は、gen serverを呼び出すと呼び出しがシリアル化されます。しかし、関数呼び出しを使用すると、同期応答を選択できます。

helloがgen_serverモジュール(gen_server:callなし)に置かれた場合、それはgen_serverのものではなくprocessを呼び出すというコンテキストで実行されます。

1

機能helloは、任意の場所から呼び出すことができます。 1000プロセスから1000回呼び出すと、各プロセスは互いに干渉しないように並列に機能を実行します。そのようなプロセスのそれぞれからそのようなlock:hello().のように呼び出すだけで、特定のモジュールで定義されているゼロ引数を取る特定の関数helloを呼び出します。

おそらくあなたの質問に言及していないことがありますか?

3

gen_serverモジュールで関数を呼び出すと、関数はgen_serverプロセスでは実行されません。呼び出し元プロセスで実行されます。

あなたが何かをするgen_serverプロセスをしたい場合は、gen_serverを使用する必要がありますが:電話またはgen_server:キャスト機能:たとえば

、gen_server:呼び出し/ 2機能は、PIDとメッセージがかかりますコールと一緒に送信されます。 gen_serverは、gen_serverプロセスでhandle_call関数を実行します。

通常、gen_server:を呼び出すgen_serverを定義する同じモジュール内に、呼び出し側が気にする必要がないようにする関数があります。これは、他の人のためのきれいなAPIを作成し、gen_server固有のものを隠します。

すべての部分をまとめて取得するのはちょっと難しいかもしれませんが、一度設定すると簡単です。 LYSEのこの章をご覧ください: http://learnyousomeerlang.com/clients-and-servers

関連する問題

 関連する問題