gpt4 book ai didi

erlang - 全局 :whereis_name() returns different Pid from different terminals

转载 作者:行者123 更新时间:2023-12-02 06:09:58 25 4
gpt4 key购买 nike

有人可以向我解释为什么从 global:whereis_name() 返回的 Pid 在不同的终端(至少在 OSX 下)是不同的。

下面是一个简单的演示。

demo.erl
-module(demo).

-export([start/0, loop/0, echo/1]).


start() ->
Pid = spawn(?MODULE, loop, []),
yes = global:register_name('demo', Pid).

echo(Msg) ->
global:send('demo', Msg).

loop() ->
receive
Msg ->
io:format("demo: ~w~n", [Msg]),
loop()
end.

A 航站楼:

erl -sname A -setcookie demo
(A@local)1> demo:start().
yes
(A@local)2> global:whereis_name(demo).
<0.39.0>
(A@local)3> demo:echo(aaa).
<0.39.0>
demo: aaa
demo: bbb
demo: ccc
(A@local)4>

航站楼 B:

erl -sname B -setcookie demo
(B@local)1> net_kernel:connect_node('A@local').
true
(B@local)2> demo:echo(bbb).
<6572.39.0>
(B@local)3> global:whereis_name(demo).
<6572.39.0>

C 航站楼:

erl -sname C -setcookie demo
(C@local)1> net_kernel:connect_node('A@local').
true
(C@local)2> demo:echo(ccc).
<5829.39.0>
(C@local)3> global:whereis_name(demo).
<5829.39.0>

为什么 global:whereis_name(demo) 在终端 B 和终端 C 返回不同的值?

最佳答案

您在节点 B 和 C 上看到的 pids 是远程 pids。 pid xxx 的第一部分( <xxx.yyy.zzz> )是远程节点号,后两部分是该节点上的进程 ID。 B 分配给 A 的远程节点编号不一定与 C 分配给 A 的编号相同。因此 pid 的第一部分可能因节点而异,但后两部分相同; <xxx.0.39>在你的例子中。所有这些 pid 都指向同一个进程。

关于erlang - 全局 :whereis_name() returns different Pid from different terminals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com