monitor(Type :: process,
Item :: monitor_process_identifier(),
Opts :: [monitor_option()]) ->
MonitorRef
OTP 24.0monitor(Type :: port,
Item :: monitor_port_identifier(),
Opts :: [monitor_option()]) ->
MonitorRef
OTP 24.0monitor(Type :: time_offset,
Item :: clock_service,
Opts :: [monitor_option()]) ->
MonitorRef
OTP 24.0MonitorRef = reference()
registered_name() | {registered_name(),node()}
pid()| registered_process_identifier()
提供用於修改監控函數的選項列表monitor/2
。這Type
和Item
參數與傳遞給時具有相同的含義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}
-
替換默認值
Tag
和UserDefinedTag
在裏麵監聽消息當監視器被觸發時傳遞。例如,當監控一個進程時,'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 monitor(Type :: process, Item :: monitor_process_identifier())用法及代碼示例
- erlang monitor(Socket)用法及代碼示例
- erlang monitor_nodes(Flag)用法及代碼示例
- erlang monitor_scope()用法及代碼示例
- erlang module(AbsForms)用法及代碼示例
- erlang max用法及代碼示例
- erlang member用法及代碼示例
- erlang min用法及代碼示例
- erlang merge用法及代碼示例
- erlang make_dir用法及代碼示例
- erlang memory用法及代碼示例
- erlang match(Table, Pattern)用法及代碼示例
- erlang match_spec_run(List, CompiledMatchSpec)用法及代碼示例
- erlang make_tuple(Arity, InitialValue)用法及代碼示例
- erlang make_tuple(Arity, DefaultValue, InitList)用法及代碼示例
- erlang map_get(Key, Map)用法及代碼示例
- erlang map_size(Map)用法及代碼示例
- erlang max(Term1, Term2)用法及代碼示例
- erlang memory()用法及代碼示例
- erlang min(Term1, Term2)用法及代碼示例
- erlang map(Fun, Orddict1)用法及代碼示例
- erlang merge(Fun, Orddict1, Orddict2)用法及代碼示例
- erlang map(Fun, MapOrIter)用法及代碼示例
- erlang merge(Map1, Map2)用法及代碼示例
- erlang merge_with(Combiner, Map1, Map2)用法及代碼示例
注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 monitor(Type :: process, Item :: monitor_process_identifier(), Opts :: [monitor_option()]) -> MonitorRef。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。