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 会更快,因为虽然所有请求是同时发送,不过它们的返回是一个一个接收的。