我们可以通过shell向现有进程发送一条消息,如下所示。我在这里通过用户名注册了一个进程(例如:Alice)代码:
start_link(Username) ->
gen_server:start_link({local, Username}, ?MODULE, [Username], []).
stop(Username)->
gen_server:stop(Username).
init([Username]) ->
io:format("~p connected...",[Username]),
{ok, #chat_server_state{
username = Username
}}.
过程开始如下:
chat_client:start_link(alice).
alice connected...{ok,<0.143.0>}
我发送消息你好处理爱丽丝和结果如下:
alice ! hello. %%sent 'hello' atom to 'alice' process
hello %% result
我的问题是,如果我用相同的cookie启动两个节点,并用net_kernel连接这两个节点,为什么我仍然不能像上面的过程那样使用注册的进程名(而不是pid)从一个节点向另一个节点发送消息。
我的代码:这里我用节点名注册进程。
start_link(Username) ->
gen_server:start_link({local, node()}, ?MODULE, [Username], []).
stop(Username)->
gen_server:stop(Username).
init([Username]) ->
io:format("~p connected...",[Username]),
{ok, #chat_server_state{
username = Username
}}.
我在alice@...节点上启动了alice进程。
(alice@DESKTOP-RD414DV)79> chat_client:start_link(alice).
alice connected...{ok,<0.280.0>}
这是此alice进程使用其节点名称注册的位置
** Registered procs on node 'alice@DESKTOP-RD414DV' **
Name Pid Initial Call Reds Msgs
'alice@DESKTOP-RD414D <0.250.0> chat_client:init/1 54 0
为什么我无法将消息从alice@.....节点发送到另一个节点(例如:鲍勃@台式机-RD 414 D**“鲍勃@台式机-RD 414 D”!您好。**)
(alice@DESKTOP-RD414DV)71> whereis('alice@DESKTOP-RD414DV').
<0.250.0>
我得到这个错误:
(alice@DESKTOP-RD414DV)50> 'bob@DESKTOP-RD414DV' ! heelo.
** exception error: bad argument
in operator !/2
called as 'bob@DESKTOP-RD414DV' ! heelo
1条答案
按热度按时间niwlg2el1#
要将消息发送到任何节点中的已注册流程,可以使用
{Name :: atom(), Node :: node()} ! Message :: term()
语法: