2012-09-20 66 views
4

我想在远程节点上执行一些过程。我不确定哪个是最好的方法来做到这一点。我可以写一个rpc:call来做到这一点。或者通过Remote ! {call, some_procedure}向节点发送消息来启动该程序并使用receive等待响应。那么erlang哪种方式更好?或者他们实际上是为了不同的用法?Erlang:远程调用vs发送消息

+0

看看我编辑的代码示例的答案。 – stemm

+0

@stemm这真的是一个详细的答案。我只是等待看看是否还有其他观点。 – halfelf

回答

9

最好使用模块rpc,因为如果你不需要:你必须管理远程节点的监控,必须提供唯一的调用ID,处理超时,还必须提供包装器以功能结果回传回应。

所有这些操作是通用,并在rpc模块来实现。

顺便提一下,也有远程调用的不同变型,这在rpc实施:同步异步调用(发送消息,该消息不需要响应)中,即使并联地图功能(pmap)。

P.S.

比较 - 简单地使用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. 
+0

认为在某些系统中,节点监控已经存在,因此编写自己的应用感知型通信模型并不是那么痛苦。 – user425720

5

RPC似乎是全面的解决方案,但它有一些与规模有关的缺点。 rpc使用单个'rex'服务器来跨节点通信,并且可能会被淹没。如果你使用rpc,你应该监控这个过程。

如果通信是主要功能,并且它是io/cpu /内存消费者的顶部,我会考虑自己编写它。另一方面,我们可能期望OTP团队的改进(并且预先优化是万恶之源!!!)。