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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。