首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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/1nb_yield/1,2检索apply(Module, Function, Args)节点上的评估值Node

yield/1nb_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是以毫秒为单位的超时值。如果通话超时,Reasontimeout

如果在呼叫超时后回复到达,则不会有消息污染呼叫者的消息队列,因为此函数会产生一个中间人流程,以充当此孤儿回复的(无效)目的地。这个功能也使得这个功能比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可能产生的一些副作用:

代码语言:javascript
复制
%% 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}时,计算完成后,或timeoutTimeout毫秒已过。

这个函数必须由相同的进程调用,async_call/4否则它只会返回timeout

parallel_eval(FuncCalls) -> ResL

类型

评估,对每一个元组FuncCallsapply(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])对于每个元件ElemList1,在平行的。返回返回值的列表,顺序与in相同List1

sbcast(Name, Msg) -> {GoodNodes, BadNodes}

类型

相当于sbcast([node()|nodes()], Name, Msg)

sbcast(Nodes, Name, Msg) -> {GoodNodes, BadNodes}

类型

将消息Msg同步广播到Name指定节点上的注册进程。

返回{GoodNodes, BadNodes},其中GoodNodesName作为注册过程的节点列表。

该函数是同步的,因为已知当呼叫返回时所有服务器都已收到消息。无法知道服务器已处理该消息。

在此函数返回后,发送到服务器的任何其他消息都会在此消息后由所有服务器接收。

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否则它将永远不会返回。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com