Erlang 获取远程节点上运行的进程的PID

Erlang 获取远程节点上运行的进程的PID,erlang,Erlang,我是Erlang的新手,我们正在开发一个小型消息服务器 我们正在尝试使用Redis(由于其他业务需要,不打算使用现有的once-grpoc、global等)作为数据存储(存储以保存用户id到“node | PID”映射)来构建流程注册表。当一个进程启动时,它以user|id(key)和{node|pid}作为值的形式向Redis注册自己。(pid在redis中存储为字符串) 在redis中插入的示例值为“user_abc”{one@mf,“0.37.0>”} 现在,当我试图为集群中运行的“use

我是Erlang的新手,我们正在开发一个小型消息服务器

我们正在尝试使用Redis(由于其他业务需要,不打算使用现有的once-grpoc、global等)作为数据存储(存储以保存用户id到“node | PID”映射)来构建流程注册表。当一个进程启动时,它以user|id(key)和{node|pid}作为值的形式向Redis注册自己。(pid在redis中存储为字符串)

在redis中插入的示例值为“user_abc”{one@mf,“0.37.0>”}

现在,当我试图为集群中运行的“user_abc”查找PID时,我在一个远程节点上得到{node and PID}作为值,在本例中是{one@mf,“0.37.0>”

问题是我们如何使用远程节点上的{node,pid}细节来连接到进程用户_abc

提前感谢您的帮助。

您可以通过在远程节点上解析该pid来获得“集群范围”的pid:

在节点
a
上:

(a@host)2> flush().
Shell got my_test
ok
(a@host)1> pid_到_列表(self())。
""
在节点
b
上:

(b@host)1> Pid=rpc:call('a@host,erlang,列表到pid,[“”]。
(b@host)2> Pid!我的测试。
我的考试
在节点
a
上:

(a@host)2> flush().
Shell got my_test
ok


请注意,该进程可能不处于活动状态,因此在与该进程对话之前对其调用
erlang:monitor/2
可能是一个好主意。

如果要将erlang pid存储到redis,并希望其他节点将其作为远程pid读取,请使用
erlang:term_to_binary(pid)
存储,并使用erlang:bianry_to_pid(PidBin)读取


查看此帖子:

谢谢Adam。是否有其他方法不需要进行RPC调用即可将其转换为Pid?我从基于用户ID存储的Redis中获取Pid,然后按照下面列出的步骤进行操作。此方法会转换,但不确定这是否是获取Pid的最有效且唯一的方法。[Node,PidStr]=re:split(UserKeyValue,:”),PidStrList=binary_to_list(PidStr),{done,{ok,T,},[]},[]=erl_scan:tokens([],PidStrList,1),{ok,Tree}=erl_parse:parse_exprs(T),{value,Res,[]}=erl_eval:exprs(Tree,[]),Pid=binary_to_to_term(Res),[Node,Pid]。那么,这两种方法以及在本地使用
list_to_pid/1
都会给您一个本地pid(它不存在)。然后执行RPC调用会给您一个指向当前节点的pid,而不是远程节点。如果您不需要当前节点上的pid,为什么还要费心解析它呢?