有人可以用Erlang解释Pid(进程标识符)的结构吗?

问题描述 投票:67回答:5

有人可以用Erlang解释Pid的结构吗?

Pid看起来像这样:<A.B.C>,例如<0.30.0>,但是我想知道这三个“位”是什么意思:A,B和C。

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

是否可以仅使用Pid在远程节点上直接发送消息?像这样:<4568.30.0>! Message,而不必显式指定已注册进程的名称和节点名称({proc_name,Node}!Message)?

erlang pid
5个回答
75
投票

打印的进程ID 6组成:

  • A,节点号(0是本地节点,远程节点的任意数字)
  • B,过程号的前15位(过程表的索引)7
  • C,过程编号的位16-18(与B相同的过程编号)7

内部,进程号在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 structureNode creation informationNode creation counter interaction with EPMD


13
投票

如果我没记错的话,格式为<nodeid,serial,creation>。0是当前节点,就像计算机始终使用主机名“ localhost”来引用自身一样。这是旧记忆所造成的,因此可能不是100%正确的方法。


8
投票

进程ID 由以下组成:


3
投票

PID是指进程和节点表。因此,只有在您从其进行调用的节点中知道消息的情况下,您才可以直接向它发送消息。


0
投票

除了其他人所说的,您可能会发现这个简单的实验对理解内部发生的事情很有帮助:

© www.soinside.com 2019 - 2024. All rights reserved.