> Erlang中文手册 > multicall/5 在指定节点上调用一个函数

rpc:multicall/5

在指定节点上调用一个函数

用法:

multicall(Nodes, Module, Function, Args, Timeout) -> {ResL, BadNodes}

内部实现:

multicall(Nodes, M, F, A, infinity)
  when is_list(Nodes), is_atom(M), is_atom(F), is_list(A) ->
    do_multicall(Nodes, M, F, A, infinity);
multicall(Nodes, M, F, A, Timeout) 
  when is_list(Nodes), is_atom(M), is_atom(F), is_list(A), is_integer(Timeout), 
       Timeout >= 0 ->
    do_multicall(Nodes, M, F, A, Timeout).

do_multicall(Nodes, M, F, A, Timeout) ->
    {Rep,Bad} = gen_server:multi_call(Nodes, ?NAME, 
				      {call, M,F,A, group_leader()}, 
				      Timeout),
    {lists:map(fun({_,R}) -> R end, Rep), Bad}.

这个函数会在指定节点上调用模拟执行 apply(Module, Function, Args),并收集返回结果信息。它会返回 {ResL, BadNodes} 格式的结果,BadNodes 是一个节点崩溃或调用超时的一个节点列表,ResL 是一个返回值的列表。

参数 Timeout 是一个毫秒为单位的整数值,如果改值为 infinity,则表示无限超时时间。

{ok, Mod} = application:get_application(),
case code:get_object_code(Mod) of
    {_Module, Bin, Fname} ->
        rpc:multicall([node()|nodes()], code, load_binary, [Mod, Fname, Bin], infinity);
    Other ->
        Other
end.

在一个 RPC 里,rpc:multicall/5 可以在从一个客户端想多个服务端同时发送信息。这有利于从节点群里收集一些信息,或在节点群里调用一个会引起一些效果作用的函数方法。在语义上,这跟在所有节点上迭代操作一系列 RPC 服务一样效果,但是 rpc:multicall/5 会更快,因为虽然所有请求是同时发送,不过它们的返回是一个一个接收的。