進程單向監控-Monitor

來源:互聯網
上載者:User

轉載:http://www.cnblogs.com/me-sa/archive/2011/11/20/erlang0016.html

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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.