【问题标题】:Gproc: Each process just return its own pid when performing lookup_pidsGproc:每个进程在执行lookup_pids时只返回自己的pid
【发布时间】:2017-06-15 01:15:18
【问题描述】:

我尝试使用 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">>)

然后我用以下方式查找 pid:

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

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

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

【问题讨论】:

    标签: erlang erlang-otp erlang-shell


    【解决方案1】:

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

    application:start(gproc),
    

    接下来,我猜当你说你正在打开 2 个 erlang 控制台时,你正在启动 2 个 erlang 节点(在 linux 中在 2 个控制台中运行 erl)。在这种情况下,您需要先将集群中的 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 共享注册?
    • 我不清楚的是:你是启动 2 个 erlang shell(你执行 erl 两次)还是在同一个节点中有 2 个 shell,使用 Ctrl-G 然后 s 然后 @987654330 @
    • 就我而言,我在 2 个不同的控制台中运行 2 个 erlang shell。
    • 所以你必须使用命名的shell(例如使用选项-sname)并连接它们。有必要创建一个节点集群并让 gproc 应用程序正常工作。如果不连接它们,这 2 个节点(也称为 VM)会相互忽略,一个节点上的 gproc 不知道另一个节点上运行的进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2013-02-26
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多