当前位置:  开发笔记 > 编程语言 > 正文

有人能解释一下Erlang中Pid的结构吗?

如何解决《有人能解释一下Erlang中Pid的结构吗?》经验,为你挑选了3个好方法。

有人能解释一下Erlang中Pid的结构吗?

Pids看起来像这样:例如<0.30.0>,但我想知道这三个"位"的含义是什么:A,B和C.

本地节点上的"A"似乎始终为0,但当Pid的所有者位于另一个节点上时,此值会更改.

是否可以仅使用Pid在远程节点上直接发送消息?这样的事情:<4568.30.0>!消息,无需明确指定已注册进程的名称和节点名称({proc_name,Node}!Message)?



1> archaelus..:

印刷工艺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 \n" on the remote node's console.
io:format(RemoteUser, "Hello from ~p~n", [node()]). 

有关更多信息,请参阅:内部PID结构, 节点创建信息, 节点创建计数器与EPMD的交互



2> Jon Gretar..:

如果我没记错,格式是.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



3> psyeugenic..:

进程ID 包括:

A,节点id不是任意的,而是dist_entry中该节点的内部索引.(它实际上是节点名称的原子槽整数.)

B,进程索引,它指的是proctab中的内部索引,(0 - > MAXPROCS).

C,串行,每次达到MAXPROCS时都会增加.

2位的创建标记不会显示在pid中,而是在内部使用,并在每次重新启动节点时增加.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有