我想在远程节点上执行一些程序。而且我不确定哪种方法是最好的方法。我可以写一个rpc:call
来做到这一点。或者通过向节点发送消息Remote ! {call, some_procedure}
来启动程序并使用receive
等待响应。那么在erlang中哪种方式更好?或者它们实际上是为了不同的用途?
问问题
4706 次
2 回答
12
最好使用 module rpc
,因为如果你不这样做:你必须管理远程节点的监控,必须提供调用的唯一 id,处理超时,你还必须提供包装器来发送回响应函数的结果。
但是所有这些操作都是通用的,并且在rpc
模块中实现。
顺便说一句,远程调用有不同的变体,实现方式有rpc
:同步和异步调用、强制转换(发送不需要响应的消息),甚至并行映射函数(pmap)。
附言
比较 - 简单地使用rpc:call与从头开始实现(同样,这是简单的实现,它不处理一些重要的情况):
-module(myrpc).
-compile(export_all).
server() ->
receive
{{CallerPid, Ref}, {Module, Func, Args}} ->
Result = apply(Module, Func, Args),
CallerPid ! {Ref, Result}
end.
call(Node, Module, Func, Args) ->
monitor_node(Node, true),
RemotePid = spawn(Node, ?MODULE, server, []),
Ref = make_ref(),
RemotePid ! {{self(), Ref}, {Module, Func, Args}},
receive
{Ref, Result} ->
monitor_node(Node, false),
Result;
{nodedown, Node} ->
error
end.
于 2012-09-20T08:26:24.637 回答
7
rpc 似乎是一个综合解决方案,但它在规模方面存在一些缺点。rpc 使用单个“rex”服务器跨节点通信,可能会不堪重负。如果你使用 rpc,你应该监控这个过程。
如果通信是主要功能并且它是 io/cpu/memory 消费者的顶部,我会考虑自己编写它。另一方面,我们可以期待 OTP 团队的改进(过早的优化是万恶之源!!!)。
于 2012-09-20T20:25:24.203 回答