register(atom, spawn..)
を使用して新しく生成されたプロセスを登録する場合、またはPid = spawn..
を使用すると違いがありますか?Erlang:プロセスの登録と変数へのPidの割り当ての違い
てみましょう最初にする単純なサーバーループ:
-module(geometry_server).
-export([loop/0]).
loop() ->
receive
{Client, {square, S} = Tuple} ->
io:format("Server: Area of square of Side ~p is ~p and Client was ~p~n", [S, S*S, Client]),
Client ! {self(), Tuple, S*S},
loop()
end.
今クライアント:
-module(geometry_client).
-export([client/2, start_server/0]).
client(Pid_server, Geom_tuple) ->
Pid_server ! {self(), Geom_tuple},
receive
{Pid_server, Geom_tuple, Area} -> io:format("Client: Area of ~p is ~p and server was ~p~n", [Geom_tuple, Area, Pid_server])
after 1000 ->
io:format("~p~n",["received nothing from server"])
end.
start_server() -> spawn(geometry_server, loop, []).
例を取るために、私はプログラミングErlangの本からの古いプログラムでこれをやりました
両方をコンパイルした後、実行します。
その後、私はそれらを呼び出すと、次のような結果を得る:私は登録した原子を使用する場合
5> geometry_client:client(Q, {square,2}).
Server: Area of square of Side 2 is 4 and Client was <0.60.0>
Client: Area of {square,2} is 4 and server was <0.77.0>
ok
6> geometry_client:client(q, {square,2}).
Server: Area of square of Side 2 is 4 and Client was <0.60.0>
"received nothing from server"
ok
なぜクライアントがサーバから何も受信しません?サーバーは明らかにクライアントからメッセージを受信しました。
私は
7> geometry_client:client(whereis(q), {square,2}).
Client: Area of {square,2} is 4 and server was <0.77.0>
Server: Area of square of Side 2 is 4 and Client was <0.60.0>
ok
12>
を行う場合は、上記した後、だから私は、メールボックスがすでに理由で前のコマンドからのサーバーからのメッセージを持っていると結論付けているので、私は、サーバーがメッセージを送っていることを確認することができますサーバーのメッセージを受信して印刷する前に、クライアントの出力が印刷されます。
何が欠けていますか?なぜ私は登録された原子を使用すると、メッセージを受信する問題はありますか?