Gproc:每个进程在执行 lookup_pids 时只是 return 自己的 pid

Gproc: Each process just return its own pid when performing lookup_pids

我试图用 gproc 注册一些带有姓氏的进程。 为此,我创建了一个包含两个函数的 gen_server,第一个是处理注册,第二个是查找已注册进程的 Pid。 之后,我打开了两个 erlang 控制台,我注册了两个具有相同 属性 的进程 (每个控制台向服务器请求注册一个进程) 我的服务器代码如下:

start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [],[]).

init([]) -> gproc:start_link(), {ok, []}.
%% Synchronous call
register(Pid, Name) ->
gen_server:call(Pid, {register, Name}).

getpids(Pid, Name) ->
gen_server:call(Pid, {getpids, Name}).

handle_call({register, Name}, _From, State) ->
gproc:reg_or_locate({p,l,Name}),
{reply, Name, State};

handle_call({getpids, Name}, _From, State) ->
Pids = gproc:lookup_pids({p,l,Name}),
{reply, Pids, State}.

handle_info(Msg, State) ->
io:format("Unexpected message: pn",[Msg]),
{noreply, State}.

terminate(normal, State) -> 
ok.  

我用

注册了我的进程
server_name:register(PID,<<"test">>)

我用以下方法查找 pids:

server_name:getpids(PID,<<"test">>)

但是当我试图获取我的家庭进程的 pids 时(基本上我必须拉出一个列表 有 2 个 pid)我只有一个 pid(每个控制台只是查找他自己注册的 pid 并且不呈现在另一个控制台注册的 pid)。

感谢您的帮助。 最好的问候。

我认为启动 gproc 应用程序的正确方法是使用:

application:start(gproc),

接下来,我猜当你说你正在打开 2 个 erlang 控制台时,你正在启动 2 个 erlang 节点(in linux 运行 erl in 2 console)。在这种情况下,您需要先将集群中的 2 个节点连接起来,例如:

在控制台 1 中

erl -sname node1

然后你会得到显示节点名称的 erlang shell 提示:host_name@node1

在控制台 2 中

erl -sname node2

然后你会得到显示节点名称的 erlang shell 提示:host_name@node2

仍在节点 2 中:

true = net_kernel:connect_node('host_name@node1').
application:start(gproc).

现在2个erlang节点已经连接,应用程序gproc已经启动,可以注册进程了。

我不确定使用函数 gproc:reg_or_locate/1 来使用相同的密钥注册多个进程是否正确,我会使用 gproc:reg/1

注册上下文也一样,我会使用全局:gproc:reg({p,g,Name})