示例
dist_demo.erl文件
%%%-------------------------------------------------------------------
%%% @author yangyamin
%%% @copyright (C) 2016, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 13. 一月 2016 下午3:20
%%%-------------------------------------------------------------------
-module(dist_demo).
-author("yangyamin").
%% API
-export([start/1, rpc/4]).
start(Node) ->
spawn(Node, fun() -> loop() end).
rpc(Pid, M, F, A) ->
Pid ! {rpc, self(), M, F, A},
receive
{Pid, Response} ->
Response
end.
loop() ->
receive
{rpc, Pid, M, F, A} ->
Pid ! {self(), catch apply(M, F, A)},
loop()
end.
分别两台机器启动erlang node.
bilbo@yangyamin.office.com)1> Pid3 = dist_demo:start('gandalf@vm-100-89.host.idcvdian.com'
报错:
(bilbo@yangyamin.office.com)7> spawn('gandalf@vm-100-89.host.idcvdian.com', fun() -> loop() end).
<6879.42.0>
(bilbo@yangyamin.office.com)8>
=ERROR REPORT==== 13-Jan-2016::15:45:18 ===
Error in process <0.42.0> on node 'gandalf@vm-100-89.host.idcvdian.com' with exit value: {{badfun,#Fun<erl_eval.20.54118792>},[{erlang,apply,2}]}
原因是调用匿名函数 loop10, 远程erlang node以为是在erl_eval中定义;
如果改成 spawn(‘gandalf@vm-100-89.host.idcvdian.com’, fun dist_demo:loop/0). 即可