Erlang,无法连接本地主机中的两个节点

xtfmy6hx  于 4个月前  发布在  Erlang
关注(0)|答案(1)|浏览(66)

所以,我在Ubuntu 20上尝试连接两个本地节点。
我试

erl -sname user1

字符串

erl -sname user2


使用这个简单的存储服务器:

-module(kvs).
-export([start/0, store/2, lookup/1]).

start() -> register(kvs, spawn(fun() -> loop() end)).
store(Key, Value) -> rpc({store, Key, Value}).

lookup(Key) -> rpc({lookup, Key}).
rpc(Q) ->
  kvs ! {self(), Q},
  receive
     {kvs, Reply} -> Reply
  end.
loop() ->
  receive
   {From, {store, Key, Value}} -> put(Key, {ok, Value}), From ! {kvs, true}, loop();
   {From, {lookup, Key}} -> From ! {kvs, get(Key)}, loop()
  end.


如果这两个节点是连接的,我应该能够在user1中启动它,并在user2中使用它,对吗?
编辑:如果我ping,我看到他们是连接的,因为它返回pong,但我仍然不能让他们在上面写的服务器上一起工作。

nvbavucw

nvbavucw1#

问题是您正在 * 本地 * 注册进程,同时也在 * 本地 * 引用它。
register/2给进程起了一个名字,这个名字只有在进程所在的节点上才知道。
所以,在你的例子中,如果你在user1@localhost上调用start/0,要从user2@localhost发送消息,你不能只使用kvs ! {the, message},你需要让Erlang知道这个进程在另一个节点上。要做到这一点,如果你事先知道这个节点,你可以使用{kvs, 'user1@localhost'} ! {the, message}.或者你需要一种不同的方式来注册和寻址你的进程。
例如,您可以使用globalpg或一些第三方库,如gproc

相关问题