登録されたプロセス (Registered Processes)
register(Alias, Pid) プロセスID: Pid のプロセスを別名(Alias)に登録
start() ->
Pid = spawn(num_anal, server, [])
register(analyser, Pid).
analyse(Seq) ->
analyser ! {self(),{analyse,Seq}},
receive
{analysis_result,R} ->
R
end.
「登録されたプロセス」へは、どのプロセスからでも
メッセージを送ることができる。
クライアントサーバモデル (Client Server Model)
メッセージ定義
要求: {request, Req}
応答: {reply, Rep}
サーバのコード
-module(myserver).
server(Data) ->
receive
{From,{request,X}} ->
{R, Data1} = fn(X, Data),
From ! {myserver,{reply, R}},
server(Data1)
end.
インタフェースライブラリ ( Interface Library ) = クライアント側
-export([request/1]).
request(Req) ->
myserver ! {self(),{request,Req}},
receive
{myserver,{reply,Rep}} ->
Rep
end.
※クライアント-サーバモデルはメッセージ通信で
簡単にかけるよ、と。「それメッセージで出来るよ。」
タイムアウト (Timeouts)
[ time ] --("tick")--> [ B ] <--(foo)-- [A]
receive
foo -> Actions1;
after
Time -> Action2
end
もしメッセージ foo を 時間Timeまでに A から
受け取っていたら Actions1を行い、そうでな
ければActions2を行う。
タイムアウトの使いかた (Uses of Timeouts)
sleep(T) - Tミリ秒の間、プロセスを止める
sleep(T) ->
receive
after
T ->
true
end.
suspend() - プロセスを無期停止
suspend() ->
receive
after
infinity ->
true
end.
alarm(T, What) - メッセージWhatはTミリ秒後にプロセスに届く
set_alarm(T, What) ->
spawn(timer, set, [self(),T,What]).
set(Pid, T, Alarm) ->
receive
after
T ->
Pid ! Alarm
end.
receive
Msg ->
... ;
end
flush() - メッセージバッファの吐き出し(flush)
flush() ->
receive
Any ->
flush()
after
0 ->
true
end.
タイムアウト(after)のあとにある値0は、メッセージ
バッファをまずチェックして、何もなければ、
続くコードを実行する、ということを意味する。
- - -
Eralng Course: Module 3 - Concurrent Programming