他のプロセスから送られてきたメッセージを誤受信しないよう制限する
刺身☆ブーメランのはてなダイアリー 2011/01/12(Wed) への返信です。
元コードの wait_server:client/3 は、receive で From を束縛しているので、この状態だとメッセージの選択受信になりません。From を Server_Pid に変更すると、ただしく動作すると思います*1。
蛇足ですが、client を spawn する件と make_ref/0 を使う件に対応した添削コードを下記に掲載しておきます*2。
-module(wait_server). -export([spawn_server/0, spawn_client/3]). -export([server/0, client/3]). -export([test/0]). spawn_server() -> spawn(wait_server, server, []). spawn_client(Server, Time, Req) -> spawn(wait_server, client, [Server, Time, Req]). server() -> receive {Client, Ref, Time, Req} -> timer:sleep(Time), Client ! {self(), Ref, Req}; stop -> exit(normal); Unknown -> io:format("Server: received unknown message: ~p~n", [Unknown]) after 60000 -> io:format("Server: timeout~n"), exit(normal) end, server(). client(Server, Time, Req) -> Ref = make_ref(), Server ! {self(), Ref, Time, Req}, receive {Server, Ref, Res} -> io:format("Client: received ~p from ~p~n", [Res, Server]), {ok, Res} after Time + 100 -> io:format("Client: timeout~n"), {ng, timeout} end. test() -> Data = {foo, bar, baz}, Server = spawn_server(), {ok, Data} = client(Server, 100, Data), Client = spawn_client(Server, 100, Data), lists:foreach( fun (_) -> Client ! ignoring end, lists:seq(1, 10) ), timer:sleep(100), Server ! stop, ok.
1> wait_server:test(). Client: received {foo,bar,baz} from <0.33.0> Client: received {foo,bar,baz} from <0.33.0> ok 2> q().