multicall(Nodes, Module, Function, Args) -> Result
OTP 23.0multicall(Nodes, Module, Function, Args, Timeout) -> Result
OTP 23.0Nodes = [atom()]
Module = Function = atom()
Args = [term()]
Timeout = timeout_time()
Result =
[{ok, ReturnValue :: term()} | caught_call_exception()]
在多個節點上並行執行多個call
操作。也就是說,並行評估節點Nodes
上的apply(Module, Function,
Args)
。 Timeout
設置所有 call
操作完成的時間上限。結果以列表形式返回,其中每個節點的結果放置在與 Nodes
中放置的節點名稱相同的位置。結果列表中的每個項目的格式如下:
{ok, Result}
-
此特定節點的
call
操作返回Result
。 {Class, ExceptionReason}
-
call
此特定節點的操作引發了類異常Class
有例外原因的ExceptionReason
。這些對應於以下例外情況call/5
可以提高。
如果出現以下情況,multicall/5
將失敗並出現 {erpc, badarg}
error
異常:
-
Nodes
不是正確的原子列表。請注意,發生故障時某些請求可能已經發送。也就是說,該函數可能會也可能不會應用於某些節點。 -
Module
不是原子。 -
Function
不是原子。 -
Args
不是列表。請注意,該列表未在客戶端驗證為正確的列表。
調用 erpc:multicall(Nodes, Module,
Function, Args)
相當於調用 erpc:multicall(Nodes, Module,
Function, Args, infinity)
。如果不考慮性能和故障行為,這些調用也相當於調用下麵的my_multicall(Nodes, Module,
Function, Args)
。 multicall()
可以利用選擇性接收優化,無需從頭開始掃描消息隊列以查找匹配的消息。然而,send_request()/receive_response()
組合無法利用此優化。
my_multicall(Nodes, Module, Function, Args) ->
ReqIds = lists:map(fun (Node) ->
erpc:send_request(Node, Module, Function, Args)
end,
Nodes),
lists:map(fun (ReqId) ->
try
{ok, erpc:receive_response(ReqId, infinity)}
catch
Class:Reason ->
{Class, Reason}
end
end,
ReqIds).
如果 erpc
操作失敗,但不知道是否/將應用該函數(即超時、連接丟失或不正確的 Nodes
列表),調用者將不會收到有關結果的任何進一步信息如果/當應用的函數完成時。如果應用函數與調用進程通信,那麽這種通信當然可以到達調用進程。
您不能對執行 apply()
的進程做出任何假設。它可能是調用進程本身、服務器或新生成的進程。
相關用法
- erlang multicall(Nodes, Module, Function, Args, Timeout)用法及代碼示例
- erlang multiple_relative_product(TupleOfBinRels, BinRel1)用法及代碼示例
- 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 monitor(Type :: process, Item :: monitor_process_identifier())用法及代碼示例
- erlang monitor(Type :: process, Item :: monitor_process_identifier(), Opts :: [monitor_option()])用法及代碼示例
- erlang map(Fun, Orddict1)用法及代碼示例
- erlang merge(Fun, Orddict1, Orddict2)用法及代碼示例
- erlang module(AbsForms)用法及代碼示例
- erlang monitor(Socket)用法及代碼示例
- erlang map(Fun, MapOrIter)用法及代碼示例
- erlang merge(Map1, Map2)用法及代碼示例
注:本文由純淨天空篩選整理自erlang.org大神的英文原創作品 multicall(Nodes, Module, Function, Args) -> Result。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。