我尝试用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。)
感谢您的帮助。 最诚挚的问候。
答案 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