2008-01-09
简易监督者
作为对进程监督机制的学习,现实现一个简易的监督者程序,监督者将监控一组进程,如果被监控的进程死掉,监督者将收到{'EXIT',Pid,Why}信号,拒此可以对被监督进程进行重启操作。
监督者启动时首先注册进程名,然后进入消息监听:
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去了。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 3563 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
一个java+sitemesh+ext+ar ...
ar?没有用过。下载看看
-- by ftmouse -
lists模块中delete函数的 ...
stworthy 写道出一个题目:假设需要对一个文件中的某个字进行删除,这个文件 ...
-- by Trustno1 -
lists模块中delete函数的 ...
出一个题目:假设需要对一个文件中的某个字进行删除,这个文件可能很大,这时用set ...
-- by stworthy -
lists模块中delete函数的 ...
小量数据可以用list 大量的就用set 或者dict之类的专门数据结构 不需要 ...
-- by mryufeng -
lists模块中delete函数的 ...
lichray 写道Trustno1 写道我认为,如果需求中存在需要随机访问的庞 ...
-- by Trustno1






评论排行榜