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

时间:2015-09-22 05:05:04

标签: erlang

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

我们正在尝试使用Redis构建流程注册表(不计划使用现有的一次grpoc,由于其他业务需求而使用全局等)作为数据存储(将用户ID保存到“node | PID”映射的存储)。当进程启动时,它以user_id(key)和{node |的形式向Redis注册自己pid}作为价值。 (pid在redis中以字符串形式出现)

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

现在,当我尝试为群集中运行的“user_abc”找到PID时,我将{node和pid}作为远程节点上的值,在这种情况下是{one @ mf,“0.37.0>”

问题是我们如何使用远程节点上的{node,pid}详细信息连接到进程user_abc。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您可以获得"群集范围" pid通过解析远程节点上的pid:

在节点a上:

(a@host)1> pid_to_list(self()).
"<0.39.0>"

在节点b上:

(b@host)1> Pid = rpc:call('a@host', erlang, list_to_pid, ["<0.39.0>"]).
<7101.99.0>
(b@host)2> Pid ! my_test.
my_test

在节点a上:

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

请注意,该过程可能尚未生效,因此在与之交谈之前调用erlang:monitor/2可能是一个好主意。

答案 1 :(得分:0)

如果您想将erlang pid存储到redis,并希望其他节点将其作为远程pid读取,请使用 erlang:term_to_binary(Pid) 进行存储,然后使用 erlang:bianry_to_pid(PidBin) 阅读。

请参阅此帖子:Erlang Pid