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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
