新規ドキュメント


忘れていく脳のための備忘録
by w_l_s
プロフィールを見る
画像一覧

プロセスの輪っかを作る

オライリーの Erlang 本にあった問題を解いてみたけど、思いのほか時間がかかった。

N 個のプロセスを作り、輪になるようにつなげましょう、という問題。
ring:start(M. N, Msg) の形に沿って無いけど、ひとまずそれっぽい動きをしてくれる。

-module(process2).
-export([start/0, child/0]).

start() ->
register(echo, spawn(process2, child, [])),
echo ! {self(), 5},
receive
{_Pid, Msg} ->
io:format("~w~n", [Msg]);
child_end ->
io:format("Return to start process.~n")
end,
echo ! stop.

child() ->
receive
{From, Count} when Count > 0 ->
Pid = spawn(process2, child, []),
io:format("self pid = ~w~n", [self()]),
io:format("child: ~w~n", [Count]),
io:format("~w~n", [Pid]),
Pid ! {From, Count - 1},
child(Pid);
{From, 0} ->
io:format("terminal~n"),
From ! child_end;
stop ->
io:format("child/0 stop"),
true
end.
child(NextPid) ->
receive
stop ->
io:format("stoping ~w~n", [self()]),
io:format("child/1 stop~n"),
NextPid ! stop
end.


実行するコードがなくなるとプロセスが終了してしまうので、作ったプロセスの ID を引数に持つchild/1 を呼び出している。こいつは終了メッセージを受け取って、自分が生成した子プロセスに終了メッセージを送信して終了する。後片付けするためだけの関数です。

プロセスが消える条件をすっかり忘れていたので、最初はすでに消えたプロセスにメッセージを送ったりして大変でした。
[PR]
by w_l_s | 2011-08-09 01:29 | erlang

カテゴリ

全体
erlang
Python
c言語
作って遊ぼう
シェルスクリプト
OS
javascript
jQuery
反省
vim
未分類

フォロー中のブログ

メモ帳

最新のトラックバック

ライフログ

検索

タグ

ファン

ブログジャンル

画像一覧