有人可以用Erlang解释Pid的结构吗?
Pid看起来像这样:<A.B.C>
,例如<0.30.0>,但是我想知道这三个“位”是什么意思:A,B和C。
'A'在本地节点上似乎始终为0,但是当Pid的所有者位于另一个节点上时,此值会更改。
是否可以仅使用Pid在远程节点上直接发送消息?像这样:<4568.30.0>! Message,而不必显式指定已注册进程的名称和节点名称({proc_name,Node}!Message)?
打印的进程ID
内部,进程号在32位仿真器上为28位宽。 B和C的奇怪定义来自R9B和早期版本的Erlang,其中B是一个15位的进程ID,当达到最大进程ID并重用了较低的ID时,C是一个包装计数器递增。
在erlang分布中,PID稍大一些,因为它们包括节点原子以及其他信息。 (Distributed PID format)
[当内部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()]).
有关更多信息,请参见:Internal PID structure,Node creation information,Node creation counter interaction with EPMD
如果我没记错的话,格式为<nodeid,serial,creation>
。0是当前节点,就像计算机始终使用主机名“ localhost”来引用自身一样。这是旧记忆所造成的,因此可能不是100%正确的方法。
进程ID
PID是指进程和节点表。因此,只有在您从其进行调用的节点中知道消息的情况下,您才可以直接向它发送消息。
除了其他人所说的,您可能会发现这个简单的实验对理解内部发生的事情很有帮助: