【问题标题】:global:whereis_name() returns different Pid from different terminalsglobal:whereis_name() 从不同的终端返回不同的 Pid
【发布时间】:2011-05-20 08:00:01
【问题描述】:

有人可以向我解释为什么从 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) 在 Terminal B 和 Terminal C 返回不同的值?

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    【讨论】:

    • 我以为是这样,但我没有在我参考的 Erlang 书籍中找到解释。非常感谢您的明确解释。
    • 查看相关问题以解释 erlang PID 格式:stackoverflow.com/questions/243363/…
    • 只是概括一下。 @archaelus 所写的内容完全正确,但您不应该真正尝试解释不透明数据类型(如 pids 和 refs)的内部格式。如果您在任何节点上的测试中比较它们,它们是相等的。如果当您向 pid 发送消息时,它们到达同一个进程,那么它们是相等的。
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2016-11-17
    相关资源
    最近更新 更多