所以,我在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,但我仍然不能让他们在上面写的服务器上一起工作。
1条答案
按热度按时间nvbavucw1#
问题是您正在 * 本地 * 注册进程,同时也在 * 本地 * 引用它。
register/2给进程起了一个名字,这个名字只有在进程所在的节点上才知道。
所以,在你的例子中,如果你在
user1@localhost
上调用start/0
,要从user2@localhost
发送消息,你不能只使用kvs ! {the, message}
,你需要让Erlang知道这个进程在另一个节点上。要做到这一点,如果你事先知道这个节点,你可以使用{kvs, 'user1@localhost'} ! {the, message}
.或者你需要一种不同的方式来注册和寻址你的进程。例如,您可以使用global、pg或一些第三方库,如
gproc
。