有人能解释一下 Erlang 中 Pid 的结构吗?
Pids 看起来像这样:<A.B.C>
, e.g. <0.30.0>
,但我想知道这三个“位”的含义是什么:A
, B
and C
.
A
似乎总是0
在本地节点上,但是当 Pid 的所有者位于另一个节点上时,该值会发生变化。
是否可以仅使用 Pid 直接在远程节点上发送消息?像这样的东西:<4568.30.0> ! Message
,无需显式指定注册进程的名称和节点名称( {proc_name, Node} ! Message
)?
打印的进程 id 由以下组成6:
- A、节点号(0为本地
节点,远程节点的任意数量)
- B、进程号的前15位(进程表的索引)7
- C,进程号的第16-18位(与B相同的进程号)7
在内部,32 位仿真器上的进程号为 28 位宽。 B 和 C 的奇怪定义来自 R9B 和 Erlang 的早期版本,其中 B 是 15 位进程 ID,C 是当达到最大进程 ID 并重用较低 ID 时递增的换行计数器。
在 erlang 发行版中,PID 稍大一些,因为它们包含节点原子以及其他信息。 (分布式PID格式)
当内部 PID 从一个节点发送到另一个节点时,它会自动转换为外部/分布式 PID 形式,所以可能是<0.10.0>
(inet_db
)在一个节点上可能最终会变成<2265.10.0>
当发送到另一个节点时。您可以像平常一样发送到这些 PID。
% get the PID of the user server on OtherNode
RemoteUser = rpc:call(OtherNode, erlang,whereis,[user]),
true = is_pid(RemoteUser),
% send message to remote PID
RemoteUser ! ignore_this,
% print "Hello from <nodename>\n" on the remote node's console.
io:format(RemoteUser, "Hello from ~p~n", [node()]).
欲了解更多信息,请参阅:内部PID结构,
节点创建信息,
节点创建计数器与 EPMD 交互
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)