簡易監督者
プロセス監督メカニズムの学習として、簡易な監督者プログラムを実現し、監督者はプロセスのグループを監視し、監視されたプロセスが死んだら、監督者は{'EXIT',Pid,Why}信号を受け取り、これを拒否して監督されたプロセスを再起動操作することができる.
監督者が起動すると、まずプロセス名を登録し、メッセージの傍受に入ります.
次に、監視プロセスを開始するコードを見てみましょう.
モニタメッセージの傍受コードを見てみましょう.
被監視者終了メッセージを受信すると、被監視者が死んだことを示し、被監視プロセスを再起動することができる.
新しい監視プロセスを登録するには、次の関数を使用します.
Erlangでは防御的プログラミングを根絶し,他のプロセスに誤りを修復させる処理哲学が特色である.簡易監督者は作成したプログラム処理を安定した運転状態にすることができ,一時的なネットワーク中断やプログラムエラーに対しては,プログラミング時にコード中でTRYがTRYに来る必要がなくなる.
監督者が起動すると、まずプロセス名を登録し、メッセージの傍受に入ります.
start() ->
register(keep_alive, spawn(fun start1/0)).
start1() ->
process_flag(trap_exit, true),
loop([]).
次に、監視プロセスを開始するコードを見てみましょう.
start_process(M, F, A) ->
case apply(M, F, A) of
{ok, Pid} when is_pid(Pid) ->
link(Pid),
io:format("start a process:~w~n", [Pid]),
{ok, Pid};
Pid when is_pid(Pid) ->
link(Pid),
io:format("start a process:~w~n", [Pid]),
{ok, Pid}
end.
モニタメッセージの傍受コードを見てみましょう.
loop(Processes) ->
receive
{From, {new_proc, M, F, A}} ->
{ok, Pid} = start_process(M, F, A),
From ! {keep_alive, started},
loop([{Pid, M, F, A}|Processes]);
{'EXIT', Pid, _} ->
case lists:keysearch(Pid, 1, Processes) of
false ->
loop(Processes);
{value, {Pid, M, F, A}} ->
P = lists:delete({Pid, M, F, A}, Processes),
{ok, Pid1} = start_process(M, F, A),
loop([{Pid1, M, F, A}|P])
end
end.
被監視者終了メッセージを受信すると、被監視者が死んだことを示し、被監視プロセスを再起動することができる.
新しい監視プロセスを登録するには、次の関数を使用します.
new_process(M, F, A) ->
keep_alive ! {self(), {new_proc, M, F, A}},
receive
{keep_alive, started} -> true
end.
Erlangでは防御的プログラミングを根絶し,他のプロセスに誤りを修復させる処理哲学が特色である.簡易監督者は作成したプログラム処理を安定した運転状態にすることができ,一時的なネットワーク中断やプログラムエラーに対しては,プログラミング時にコード中でTRYがTRYに来る必要がなくなる.