简易监督者

作为对进程监督机制的学习,现实现一个简易的监督者程序,监督者将监控一组进程,如果被监控的进程死掉,监督者将收到{'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去了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值