Erlang 全局:whereis_name()从不同的终端返回不同的Pid

Erlang 全局:whereis_name()从不同的终端返回不同的Pid,erlang,Erlang,有人能给我解释一下为什么从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: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>
erl-sname A-setcookie演示
(A@local)1> 演示:开始()。
对
(A@local)2> 全局:何处是_名称(演示)。
(A@local)3> 演示:回声(aaa)。
演示:aaa
演示:bbb
演示: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>
erl-sname B-setcookie演示
(B@local)1> net\u内核:连接\u节点('A@local').
真的
(B@local)2> 演示:echo(bbb)。
(B@local)3> 全局:何处是_名称(演示)。
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>
erl-sname C-setcookie演示
(C@local)1> net\u内核:连接\u节点('A@local').
真的
(C@local)2> 演示:echo(ccc)。
(C@local)3> 全局:何处是_名称(演示)。

为什么全局:whereis_name(演示)在终端B和终端C中返回不同的值?

在节点B和C上看到的PID是远程PID。pid的第一部分(
xxx
)是远程节点号,第二部分是该节点上的进程id。B为A分配的远程节点编号不一定与C为A分配的编号相同。因此,pid的第一部分可能因节点而异,但后两部分相同<代码>在您的示例中。所有这些PID都指向同一个过程。

我原以为是这样,但在我引用的Erlang书籍中没有找到解释。非常感谢您的清晰解释。请参阅相关问题来解释erlang PID格式:只是简单概括一下。@archelus编写的内容完全正确,但您不应该真正尝试解释不透明数据类型(如pids和refs)的内部格式。如果在任何节点上的测试中比较它们,则它们是相等的。如果您向pids发送消息时,它们到达的过程相同,则它们是相等的。