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

时间:2017-01-29 22:02:22

标签: erlang otp erlang-shell

我尝试用gproc命名一些名为famliy的进程。 出于这个原因,我创建了一个包含两个函数的gen_server,第一个用于处理注册,第二个用于查找已注册进程的Pids。 之后,我打开了两个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。)

感谢您的帮助。 最诚挚的问候。

1 个答案:

答案 0 :(得分:0)

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

checkDriverIfExist

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

在控制台1中

application:start(gproc),

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

在控制台2中

erl -sname node1

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

仍在节点2中:

erl -sname node2

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

我不确定使用函数true = net_kernel:connect_node('host_name@node1'). application:start(gproc). 以便使用相同的密钥注册多个进程是正确的,我会使用gproc:reg_or_locate/1

对于注册上下文,我会使用全局:gproc:reg/1