浏览 2152 次
锁定老帖子 主题:简易监督者
精华帖 (0) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间: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去了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |