我想在远程节点上执行一些程序。 而且我不知道这是为了做到这一点的最好办法。 我可以写一个rpc:call
做到这一点。 或发送邮件Remote ! {call, some_procedure}
Remote ! {call, some_procedure}
到节点启动程序,并使用receive
等待响应。 因此,这方法是在二郎山更好? 或者,他们其实是不同的使用情况?
Answer 1:
这是更好地使用模块rpc
,因为如果不这样做: 你必须管理远程节点的监控,必须提供调用的唯一的ID,处理超时,还你必须提供包装发回响应随着功能的结果。
但是, 所有这些操作都是通用的 ,在执行rpc
模块。
顺便提一下,也有远程调用,这在实现的不同变化rpc
: 同步和异步调用 , 浇铸 (发送消息,该消息不需要响应)中,即使并联地图功能(PMAP)。
PS
比较-简单地使用RPC:调用与实现从无到有(也,这是简单的实现,它不处理一些重要的情况下):
-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.
Answer 2:
RPC似乎是全面的解决方案,但它有规模相关的一些缺点。 RPC使用单一“雷克斯”服务器交叉节点的通信并且潜在地可能被淹没。 如果你使用RPC去,你应该监视这个过程。
如果通信的主要功能,它是IO / CPU /内存的消费者,我会考虑自己写它的顶部。 在另一方面,我们可以期望从OTP团队的改进(和成熟的预优化是一切罪恶的根源!)。
文章来源: Erlang: remote call vs sending messages