有人能解释一下Erlang中Pid的结构吗?
Pids看起来像这样:
例如<0.30.0>,但我想知道这三个"位"的含义是什么:A,B和C.
本地节点上的"A"似乎始终为0,但当Pid的所有者位于另一个节点上时,此值会更改.
是否可以仅使用Pid在远程节点上直接发送消息?这样的事情:<4568.30.0>!消息,无需明确指定已注册进程的名称和节点名称({proc_name,Node}!Message)?
印刷工艺ID
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\n" on the remote node's console. io:format(RemoteUser, "Hello from ~p~n", [node()]).
有关更多信息,请参阅:内部PID结构, 节点创建信息, 节点创建计数器与EPMD的交互
如果我没记错,格式是
.0是当前节点,很像计算机总是有主机名"localhost"来引用它自己.这是旧记忆所以它可能不是100%正确的强硬.
但是,是的.例如,您可以构建pid list_to_pid/1
.
PidString = "<0.39.0>", list_to_pid(PidString) ! message.
当然.您只需使用您需要的任何方法来构建PidString.可能写一个生成它的函数,并使用它而不是像这样的PidString:
list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message
进程ID
A,节点id不是任意的,而是dist_entry中该节点的内部索引.(它实际上是节点名称的原子槽整数.)
B,进程索引,它指的是proctab中的内部索引,(0 - > MAXPROCS).
C,串行,每次达到MAXPROCS时都会增加.
2位的创建标记不会显示在pid中,而是在内部使用,并在每次重新启动节点时增加.