2006/12/18

Erlang コンカレントプログラミング

Erlang の特徴1つとして Concurrent Programming が挙げられる。OS(カーネル)レベルのスレッドではなく、ユーザレベルのスレッドであるが、非常に軽量で他の言語のスレッドプログラミングでは実現できないような、多重実行も可能らしい。
process(thread)間で共有するデータがない、という理由から、Erlang では thread ではなく process という言葉を使っている。

-module(concurrent_try).

-export([foo/2, run_foo/0]).

foo(_, 0) ->
io:format("おしまい。~n");
foo(Str, RepeatTime) ->
io:format(Str),
foo(Str, RepeatTime - 1).

run_foo() ->
spawn(concurrent_try, foo, ["ひつじ~n", 3]),
spawn(concurrent_try, foo, ["かもめ~n", 3]).

これを実行すると次のようになる。
18> concurrent_try:run_foo().
ひつじ
かもめ
<0.98.0>ひつじ
かもめ

ひつじ
かもめ
19> おしまい。
19> おしまい。


ビルトインファンクションの spawn(Module, Exported_Function, List of Arguments) で新しいプロセス作成する。

出力に混ざってる <0.98.0> は2つめの spawn の返り値で "process identifier" または "pid" である。プロセス固有の識別子である。

メッセージ送受信


プロセス間の共有データのかわりに、プロセス間ではメッセージの送受信が行われる。
receive でメッセージを受信し、! でメッセージを送信する。
server_loop() ->
receive Str ->
io:format("「~s」~n", [Str])
end,
server_loop().

45> ServerPID = spawn(concurrent_try, server_loop, []).
<0.161.0>
46> ServerPID ! "あいう".
「あいう」
[130,160,130,162,130,164]

0 件のコメント: