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})
我试图用 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})