當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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