当我们运行 node() 命令时,我们会得到节点的 pid。格式 <0.X.0> 如果我们在同一个节点上,并且当我们从其他节点运行相同的命令时得到 <XY0> 形式的结果。我想知道如何从同一节点上的 < XY0> 获取值 X。
这个问题的答案说,Erlang PID实际上是28位整数,其中前10个是节点号(本地节点始终为0),其后18个是全局过程表的索引。因此,如果我的理解是正确的,那么假设我们仅在单个节点上工作,则唯一pid的最大数量为2 ^ 18,即大约262,000。这是否是我可以随时间在单个Erlang节点上产生的最大进程数?如果我有一个运行时间很长的Erlang节点,分配我的第2 ^ 18 + 1个节点后,VM会立即崩溃吗?还是可以重用旧的未使用的pid?如果是这样,该过程如何在虚拟机级别实施?
当测试开源项目'gproc'函数时,我发现list_to_pid对于本地pid是好的,而对于远程pid则不行.我的erlang运行时是R15B.
(dist_test_n2@yus-iMac.local)29> D = list_to_pid("<0.239.0>").
<0.239.0>
(dist_test_n2@yus-iMac.local)30> D == self(). %% equal here
true
(dist_test_n2@yus-iMac.local)31> f(E).
ok
(dist_test_n2@yus-iMac.local)32> E = gproc:where(Name).
<8969.239.0>
(dist_test_n2@yus-iMac.local)33> F = list_to_pid("<8969.239.0>").
<8969.239.0>
(dist_test_n2@yus-iMac.local)34> F == E. %% not equal here
false
Run Code Online (Sandbox Code Playgroud)
从用户指南有关此功能,没有这样的限制.是bug吗?
在决定一个客户端参数结构到一个OTP
gen_server 时,是否需要将Pid
和 都Node name
插入到参数结构中?
给定一个遥控器pid
,是否可以转换pid
为node name
?我的意思是完整的节点名称,例如"emacs@yus-iMac.local".
有人可以向我解释为什么Pid从全局返回:whereis_name()在不同的终端(在OSX下,至少)完成时是不同的.
下面是一个简单的演示.
demo.erl
-module(demo).
-export([start/0, loop/0, echo/1]).
start() ->
Pid = spawn(?MODULE, loop, []),
yes = global:register_name('demo', Pid).
echo(Msg) ->
global:send('demo', Msg).
loop() ->
receive
Msg ->
io:format("demo: ~w~n", [Msg]),
loop()
end.
Run Code Online (Sandbox Code Playgroud)
航站楼A:
erl -sname A -setcookie demo
(A@local)1> demo:start().
yes
(A@local)2> global:whereis_name(demo).
<0.39.0>
(A@local)3> demo:echo(aaa).
<0.39.0>
demo: aaa
demo: bbb
demo: ccc
(A@local)4>
Run Code Online (Sandbox Code Playgroud)
B航站楼:
erl -sname B -setcookie demo
(B@local)1> net_kernel:connect_node('A@local').
true
(B@local)2> demo:echo(bbb).
<6572.39.0>
(B@local)3> global:whereis_name(demo).
<6572.39.0>
Run Code Online (Sandbox Code Playgroud)
终端C:
erl -sname C -setcookie demo
(C@local)1> net_kernel:connect_node('A@local').
true
(C@local)2> demo:echo(ccc). …
Run Code Online (Sandbox Code Playgroud) 如何更改Erlang VM以使用其中一个pid值的随机128位值?
我现在可以设置的最大值似乎是:
32> pid(1, 32767, 8191).
** exception error: bad argument
in function list_to_pid/1
called as list_to_pid("<1.32767.8191>")
in call from c:pid/3 (c.erl, line 419)
33> pid(0, 32767, 8191).
<0.32767.8191>
Run Code Online (Sandbox Code Playgroud)
看起来pid的产生归结为这样的事情erts/emulator/beam/erl_ptab.h:283
:
ERTS_GLB_INLINE Eterm
erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag)
{
HUint huint;
Uint32 low_data = (Uint32) data;
low_data &= (1 << ERTS_PTAB_ID_DATA_SIZE) - 1;
low_data <<= ERTS_PTAB_ID_DATA_SHIFT;
huint.hval[ERTS_HUINT_HVAL_HIGH] = erts_ptab_data2pix(ptab, data);
huint.hval[ERTS_HUINT_HVAL_LOW] = low_data | ((Uint32) tag);
return (Eterm) huint.val;
}
Run Code Online (Sandbox Code Playgroud) 我有4个erlang节点在多进程应用程序上一起工作.在我的订单中,一个进程是监视器,它在区域上绘制进程的位置,另外3个节点处理进程的位置和移动.在监视器上,当密钥是进程PID时,我使用ETS数据库存储位置,我注意到节点创建的进程具有相同的PID,这显然会中断整个系统的管理.
我试图将进程连接到:
net_adm:ping(...).
net_kernel:connect(...).
Run Code Online (Sandbox Code Playgroud)
希望当节点彼此意识到时,他们会给出不同的PID,但是没有用.
我需要在Erlang中将pid转换为二进制,并将其发送到另一个pid.但我需要二进制数据的大小为1个字节.它可以吗?