選択的メッセージ受信 (Selective Message Reception)
以下のとき、メッセージの発信順序とは関係なく、
foo, bar の順に受信処理される。
recieve
foo -> true
end,
recieve
bar -> true
end
どのメッセージも選択 (Selection of any message)
以下の場合、変数Msgにどんなメッセージでも束縛される。
(変数書き換えはないので)到着順で、最初のメッセージが束縛、処理される。
receive
Msg -> ...
end
※たぶん、その後も同じ値がきたときだけ、処理されるだろう。
例: 通話 (A Telephony Example)
AからBに電話をかける。この状態をCallというプロセスで表現
ringing_a(A, B) ->
receive
{A, on_hook} ->
A ! {stop_tone, ring},
B ! terminate,
idle(A);
{B, answered} ->
A ! {stop_tone, ring},
switch ! {connect, A, B},
conversation_a(A, B)
end.
AとBはプロセスCall内のローカル変数。
(なので、誰と誰でも通話できる。)
※こんなかんじ?
1. ringing_a(A, B)で電話をかけ、状態遷移待ち。
Aの受話器からはダイアルトーンが流れている。
Bの受信ベルがなっている状態。
2. {A, on_hook}: Aが受話器を置く。
Aのダイアルトーンを止め、Bのベル音終了、
Aは次のイベント待ち。
3. {B, answered}: Bが受話器をとり、応答。
Aのダイアルトーンを止め、
交換機にAとBの接続を指示。
AとBの通信開始。
プロセスIDもメッセージで送れる(Pids can be sent in messages)
プロセスA
B ! { transfer, self() }
プロセスB
receive
{transfer, A} -> C ! {transfer, A}
end
プロセスC
receive
{transfer, A} -> A ! {transfer, A}
end
プロセスCがプロセスAを直接呼び出している
- - -
Eralng Course: Module 3 - Concurrent Programming