當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


erlang monitor(Type :: process, Item :: monitor_process_identifier(), Opts :: [monitor_option()])用法及代碼示例

monitor(Type :: process,
        Item :: monitor_process_identifier(),
        Opts :: [monitor_option()]) ->
           MonitorRef
OTP 24.0
monitor(Type :: port,
        Item :: monitor_port_identifier(),
        Opts :: [monitor_option()]) ->
           MonitorRef
OTP 24.0
monitor(Type :: time_offset,
        Item :: clock_service,
        Opts :: [monitor_option()]) ->
           MonitorRef
OTP 24.0
類型:
MonitorRef = reference()
registered_name() =atom()
registered_process_identifier() =
registered_name() | {registered_name(),node()}

monitor_process_identifier() =
pid()| registered_process_identifier()

monitor_port_identifier() =port()| registered_name()

提供用於修改監控函數的選項列表monitor/2。這TypeItem參數與傳遞給時具有相同的含義monitor/2。目前可用的選項:


{alias, UnaliasOpt}

返回的監視器引用也將成為調用進程的別名。也就是說,返回的引用可用於向調用進程發送消息。也可以看看alias()。這UnaliasOpt確定應如何停用別名。


explicit_unalias

僅顯式調用unalias/1將停用別名。


demonitor

當監視器被移除時,別名將自動停用。這可以通過顯式調用demonitor/1或者當它與以下內容同時自動刪除時'DOWN'由於監視器的原因,消息被傳遞。別名仍然可以通過調用來停用unalias/1.


reply_demonitor

當監視器被移除(參見上麵的 demonitor 選項)或收到通過別名發送的回複消息時,別名將自動停用。當通過別名收到回複消息時,監視器也將自動刪除。當客戶端監視服務器並通過別名獲取回複時,這在客戶端/服務器場景中非常有用。一旦收到響應,無論響應是回複還是 'DOWN' 消息,別名和監視器都將自動刪除。別名仍然可以通過調用 unalias/1 來停用。請注意,如果使用 unalias/1 BIF 刪除別名,監視器仍將保持活動狀態。

例子:

server() ->
    receive
        {request, AliasReqId, Request} ->
            Result = perform_request(Request),
            AliasReqId ! {reply, AliasReqId, Result}
    end,
    server().

client(ServerPid, Request) ->
    AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]),
    ServerPid ! {request, AliasMonReqId, Request},
    %% Alias as well as monitor will be automatically deactivated if we
    %% receive a reply or a 'DOWN' message since we used 'reply_demonitor'
    %% as unalias option...
    receive
        {reply, AliasMonReqId, Result} ->
            Result;
        {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} ->
            error(ExitReason)
    end.

請注意,此示例中的服務器和客戶端都必須至少在 OTP 24 係統上執行才能使其正常工作。

有關進程別名的更多信息,請參閱進程別名的部分Erlang參考手冊.


{tag, UserDefinedTag}

替換默認值TagUserDefinedTag在裏麵監聽消息當監視器被觸發時傳遞。例如,當監控一個進程時,'DOWN'向下消息中的標簽將被替換為UserDefinedTag.

一個例子說明如何{tag, UserDefinedTag}可以使用選項來啟用新的選擇性接收優化,在 OTP 24 中引入,當向不同服務器發出多個請求時:

server() ->
    receive
        {request, From, ReqId, Request} ->
            Result = perform_request(Request),
            From ! {reply, self(), ReqId, Result}
    end,
    server().

client(ServerPids, Request) when is_list(ServerPids) ->
    ReqId = make_ref(),
    lists:foreach(fun (ServerPid) ->
                          _ = monitor(process, ServerPid,
                                      [{tag, {'DOWN', ReqId}}]),
                          ServerPid ! {request, self(), ReqId, Request}
                  end,
                  ServerPids),
    receive_replies(ReqId, length(ServerPids), []).

receive_replies(_ReqId, 0, Acc) ->
    Acc;
receive_replies(ReqId, N, Acc) ->
    %% The compiler will detect that we match on the 'ReqId'
    %% reference in all clauses, and will enable the selective
    %% receive optimization which makes the receive able to
    %% skip past all messages present in the message queue at
    %% the time when the 'ReqId' reference was created...
    Res = receive
              {reply, ServerPid, ReqId, Result} ->
                  %% Here we typically would have deactivated the
                  %% monitor by a call to demonitor(Mon, [flush]) but
                  %% we ignore this in this example for simplicity...
                  {ok, ServerPid, Result};
              {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} ->
                  {error, ServerPid, ExitReason}
          end,
    receive_replies(ReqId, N-1, [Res | Acc]).

為了使該示例按預期工作,客戶端必須至少在 OTP 24 係統上執行,但服務器可以在較舊的係統上執行。

相關用法


注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 monitor(Type :: process, Item :: monitor_process_identifier(), Opts :: [monitor_option()]) -> MonitorRef。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。