当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang multicall(Nodes, Module, Function, Args)用法及代码示例


multicall(Nodes, Module, Function, Args) -> Result
OTP 23.0
multicall(Nodes, Module, Function, Args, Timeout) -> Result
OTP 23.0
类型:
Nodes = [atom()]
Module = Function = atom()
Args = [term()]
Timeout = timeout_time()
Result = 
    [{ok, ReturnValue :: term()} | caught_call_exception()]
caught_call_exception() =
{扔,扔::term()} |
{退出,{异常,原因::term()}} |
{错误,
{异常,原因::term(), StackTrace::[stack_item()]}} |
{退出,{信号,原因::term()}} |
{错误,{erpc,原因::term()}}

stack_item() =
{模块::atom(),
函数::atom(),
数量::arity()| (参数::[term()]),
地点::
[{文件,文件名::string()} |
{行,行::integer() >= 1}]}

在多个节点上并行执行多个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.org大神的英文原创作品 multicall(Nodes, Module, Function, Args) -> Result。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。