二郎神:远程呼叫VS发送消息(Erlang: remote call vs sending mess

2019-07-31 18:12发布

我想在远程节点上执行一些程序。 而且我不知道这是为了做到这一点的最好办法。 我可以写一个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