rpc
RPC
模块
RPC
模块摘要
远程过程调用服务。
描述
此模块包含类似于远程过程调用的服务。它还包括广播设施和并行评价器。远程过程调用是在远程节点上调用函数并收集答案的方法。它用于收集远程节点上的信息,或用于运行对远程节点具有特定副作用的函数。
数据类型
key()
由async_call/4
返回。
出口
abcast(Name, Msg) -> abcast
类型
相当于abcast([node()|nodes()], Name, Msg)
。
abcast(Nodes, Name, Msg) -> abcast
类型
将消息Msg
异步广播到Name
指定节点上的注册进程。
async_call(Node, Module, Function, Args) -> Key
类型
使用promises
实现调用流
,这是一种在结果完成前不会挂起调用者的RPC类型。而是返回一个密钥,稍后可以使用该密钥来收集该值。关键可以被看作是提供答案的承诺。
在这种情况下,Key
返回键,这可以用于后续调用yield/1
或nb_yield/1,2
检索apply(Module, Function, Args)
节点上的评估值Node
。
注
yield/1
和nb_yield/1,2
必须由从中进行该功能的相同过程调用,否则它们将永远不会正确地产生。
block_call(Node, Module, Function, Args) -> Res | {badrpc, Reason}
类型
与之相同call/4
,但RPC服务器Node
不会创建单独的进程来处理呼叫。因此,如果调用的目的是阻止RPC服务器与其他任何传入请求阻塞,直至请求被处理,则可以使用此函数。当评估非常小的快速功能时,该功能也可以用于效率的原因,例如保证不会挂起的BIF。
block_call(Node, Module, Function, Args, Timeout) ->
Res | {badrpc, Reason}
类型
与block_call/4
相同,但具有与超时值相同的超时价值call/5
。
call(Node, Module, Function, Args) -> Res | {badrpc, Reason}
类型
apply(Module, Function, Args)
在节点上评估Node
并返回相应的值Res
,或者{badrpc, Reason}
如果调用失败。
call(Node, Module, Function, Args, Timeout) ->
Res | {badrpc, Reason}
类型
apply(Module, Function, Args)
在节点上评估Node
并返回相应的值Res
,或者{badrpc, Reason}
如果调用失败。Timeout
是以毫秒为单位的超时值。如果通话超时,Reason
是timeout
。
如果在呼叫超时后回复到达,则不会有消息污染呼叫者的消息队列,因为此函数会产生一个中间人流程,以充当此孤儿回复的(无效)目的地。这个功能也使得这个功能比call/4
来电者更加昂贵。
cast(Node, Module, Function, Args) -> true
类型
apply(Module, Function, Args)
在节点上评估Node
。在评估完成之前,没有响应被传递并且调用过程没有被暂停,就像情况一样call/4,5
。
eval_everywhere(Module, Function, Args) -> abcast
类型
相当于eval_everywhere([node()|nodes()], Module, Function, Args)
。
eval_everywhere(Nodes, Module, Function, Args) -> abcast
类型
apply(Module, Function, Args)
在指定节点上评估。没有收到答案。
multi_server_call(Name, Msg) -> {Replies, BadNodes}
类型
相当于multi_server_call([node()|nodes()], Name, Msg)
。
multi_server_call(Nodes, Name, Msg) -> {Replies, BadNodes}
类型
可以Name
在与指定节点上调用的服务器交互时使用。假定服务器以格式接收消息{From, Msg}
并使用答复From ! {Name, Node, Reply}
,其中Node
是服务器所在节点的名称。函数返回{Replies, BadNodes}
,其中Replies
是所有Reply
值的列表,并且BadNodes
是以下之一:
- 不存在的节点的列表。
- 不存在服务器的节点列表。
- 在发送任何答复之前服务器终止的节点列表。
multicall(Module, Function, Args) -> {ResL, BadNodes}
类型
相当于multicall([node()|nodes()], Module, Function, Args, infinity)
。
multicall(Nodes, Module, Function, Args) -> {ResL, BadNodes}
类型
相当于multicall(Nodes, Module, Function, Args, infinity)
。
multicall(Module, Function, Args, Timeout) -> {ResL, BadNodes}
类型
相当于multicall([node()|nodes()], Module, Function, Args, Timeout)
。
multicall(Nodes, Module, Function, Args, Timeout) ->
{Resl,BadNodes}
类型
与RPC不同的是,multicall是从一个客户端同时发送到多个服务器的RPC。这对于从一组节点收集信息或调用一组节点上的功能以获得一些副作用非常有用。它在语义上与迭代地在所有节点上进行一系列RPC相同,但多路由更快,因为所有请求都是在同一时间发送的,并在返回时逐一收集。
该函数apply(Module, Function, Args)
在指定节点上评估并收集答案。它返回{ResL, BadNodes}
,其中BadNodes
是在计算期间终止或超时的节点列表,并且ResL
是返回值的列表。Timeout
是以毫秒为单位的时间(整数),或infinity
。
以下示例在将新的对象代码加载到网络中的所有节点时非常有用,并指出RPC可能产生的一些副作用:
%% Find object code for module Mod
{Mod, Bin, File} = code:get_object_code(Mod),
%% and load it on all nodes including this one
{ResL, _} = rpc:multicall(code, load_binary, [Mod, File, Bin]),
%% and then maybe check the ResL list.
nb_yield(Key) -> {value, Val} | timeout
类型
相当于nb_yield(Key, 0)
。
nb_yield(Key, Timeout) -> {value, Val} | timeout
类型
非阻塞版本的yield/1
。它返回的元组{value, Val}
时,计算完成后,或timeout
当Timeout
毫秒已过。
注
这个函数必须由相同的进程调用,async_call/4
否则它只会返回timeout
。
parallel_eval(FuncCalls) -> ResL
类型
评估,对每一个元组FuncCalls
,apply(Module, Function, Args)
网络中的某个节点上。返回返回值的列表,顺序与in相同FuncCalls
。
pinfo(Pid) -> {Item, Info} | undefined
类型
erlang:process_info/1
在ERTS中定位BIF的透明版本。
pinfo(Pid, Item) -> {Item, Info} | undefined | []
pinfo(Pid, ItemList) -> {Item, Info} | undefined | []
类型
erlang:process_info/2
在ERTS中定位BIF的透明版本。
pmap(FuncSpec, ExtraArgs, List1) -> List2
类型
评估apply(Module, Function, [Elem|ExtraArgs])
对于每个元件Elem
中List1
,在平行的。返回返回值的列表,顺序与in相同List1
。
sbcast(Name, Msg) -> {GoodNodes, BadNodes}
类型
相当于sbcast([node()|nodes()], Name, Msg)
。
sbcast(Nodes, Name, Msg) -> {GoodNodes, BadNodes}
类型
将消息Msg
同步广播到Name
指定节点上的注册进程。
返回{GoodNodes, BadNodes}
,其中GoodNodes
是Name
作为注册过程的节点列表。
该函数是同步的,因为已知当呼叫返回时所有服务器都已收到消息。无法知道服务器已处理该消息。
在此函数返回后,发送到服务器的任何其他消息都会在此消息后由所有服务器接收。
server_call(Node, Name, ReplyWrapper, Msg) ->
Reply | {error, Reason}
类型
可以在与Name
节点上调用的服务器交互时使用Node
。假定服务器以格式接收消息{From, Msg}
并使用回复From ! {ReplyWrapper, Node, Reply}
。该函数进行这样的服务器调用,并确保将整个调用打包到原子事务中,该事务要么成功要么失败。它永远不会挂起,除非服务器本身挂起。
该函数返回Reply
由服务器产生的答案Name
,或者{error, Reason}
。
yield(Key) -> Res | {badrpc, Reason}
类型
返回前一个承诺的答案async_call/4
。如果答案可用,则立即返回。否则,呼叫过程将暂停,直到答案到达Node
。
注
这个函数必须由相同的进程调用,async_call/4
否则它将永远不会返回。