定義(Definitions)
* プロセス Process - 並列動作。完全な仮想マシン。
システムはたくさんの並列プロセスを
同時に実行することがある。
* メッセージ Message - プロセス間通信手段
* タイムアウト Timeout - あたえられた時間の間、待機するしくみ。
* 登録プロセス Registered Process - 名前で登録されたプロセス
* クラ/サバ モデル Client/Server Model - 並列実行の基本モデル
プロセスの生成(Creating a New Process)
以下の命令でプロセスが生成される。Pid2はプロセスの
識別子(Pid = Process id)を保持する変数。
Pid2 = spawn(Mod, Func, Args)
簡単なメッセージ送信(Simple Message Passing)
プロセスA(送信側)
B!{self(), foo}.
プロセスB(受信側)
recieve
{From, Msg} -> Actions ...
end
組込関数self()は自分自身のPidを取得する。
この場合、受信側で
From = プロセスAのPid
Msg = foo
が入る
プロセスA(送信側)
B!{self(), {digits, [1, 2, 6] }.
プロセスB(受信側)
recieve
{A, { digits, D } } -> analyse(D);
end
この場合、受信側で
A = プロセスAのPid
D = [1, 2, 6]
が入るので、analyse([1, 2, 6])が実行される。
すでに A が代入済みの場合は、データのみ
受け入れ(accept)られる。
※こういうことか?
recieve
{ _, { digits, D } } -> analyse(D).
end
エコープロセスの例(An Echo process)
-module(echo).
-export([go/0, loop/0]).
go() ->
Pid2 = spawn(echo, loop, []),
Pid2 ! {self(), hello},
receive
{Pid2, Msg} ->
io:format("P1 ~w~n",[Msg])
end,
Pid2 ! stop.
loop() ->
receive
{From, Msg} ->
From ! {self(), Msg},
loop();
stop ->
true
end.
go()で送信側。Pid2(受信側)プロセスを生成し、
文字列メッセージを送る。Pid2からの文字列メッセージを待ち、
受信したら Pid2に終了メッセージを送る。
loop()は受信側。
文字列メッセージと終了メッセージがある。
文字列メッセージは、送信元に同じ文字列メッセージを返す。
終了メッセージも受け取る(実行が停止する)。
実行方法
echo.erl に保存して、
> c(echo).
> echo:go().
P1 hello
stop
>
- - -
Eralng Course: Module 3 - Concurrent Programming