进程单向监控-Monitor

进程单向监控-Monitor

link方式可以建立进程之间的双向链接关系,我们可以通过monitor实现单向的监控,这在gen_server代码里面可以看到对应的例子

  •  erlang:monitor(process, Caller), %建立单向监控
  • 被监控进程死掉发送的消息规格:   {'DOWN',Mref,process,Pid,Reason}
  • 解除监控:erlang:demonitor(Ref)

gen_server代码片段:

do_multi_call(Nodes, Name, Req, Timeout) ->
    Tag = make_ref(),
    Caller = self(),
    Receiver =
 spawn(
   fun() ->
    %% Middleman process. Should be unsensitive to regular
    %% exit signals. The sychronization is needed in case
    %% the receiver would exit before the caller started
    %% the monitor.
    process_flag(trap_exit, true),
    Mref = erlang:monitor(process, Caller), %建立单向监控
    receive
        {Caller,Tag} ->
     Monitors = send_nodes(Nodes, Name, Tag, Req),
     TimerId = erlang:start_timer(Timeout, self(), ok),
     Result = rec_nodes(Tag, Monitors, Name, TimerId),
     exit({self(),Tag,Result});
        {'DOWN',Mref,_,_,_} ->  %接受监控消息
     %% Caller died before sending us the go-ahead.
     %% Give up silently.
     exit(normal)
    end
   end),
    Mref = erlang:monitor(process, Receiver),
    Receiver ! {self(),Tag},
    receive
 {'DOWN',Mref,_,_,{Receiver,Tag,Result}} ->
     Result;
 {'DOWN',Mref,_,_,Reason} ->
     %% The middleman code failed. Or someone did 
     %% exit(_, kill) on the middleman process => Reason==killed
     exit(Reason)
    end.


handle_call({subscribe, PId}, _From, #state{subscribers = Subscribers} = State) ->
    NSubscribers = ordsets:add_element(PId, Subscribers),
    erlang:monitor(process, PId),
    {reply, {ok, ok}, State#state{subscribers = NSubscribers}};

handle_info({'DOWN', _MRef, _, PId, _Reason}, #state{subscribers = Subscribers} = State) ->
    NSubscribers = ordsets:del_element(PId, Subscribers),
    {noreply, State#state{subscribers = NSubscribers}};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值