hal*_*elf 6 erlang rpc message
我想在远程节点上执行一些过程.而且我不确定哪种方法最好.我可以写一个rpc:call来做这个.或者向Remote ! {call, some_procedure}节点发送消息以启动过程并使用receive等待响应.那么在erlang中哪种方式更好?或者它们实际上是用于不同的用途?
ste*_*emm 11
最好使用模块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.
Run Code Online (Sandbox Code Playgroud)
rpc似乎是全面的解决方案,但它有一些与规模相关的缺点.rpc使用单个"rex"服务器来跨越节点通信,并且可能会使其不堪重负.如果你使用rpc,你应该监控这个过程.
如果通信是主要功能,并且它是io/cpu/memory消费者的首选,我会考虑自己编写它.另一方面,我们可以期待OTP团队的改进(并且预先成熟的优化是所有邪恶的根源!!!).
| 归档时间: |
|
| 查看次数: |
4235 次 |
| 最近记录: |