收集关于simple_one_for_one工人的信息

问题描述:

我有一个主管(称为alice),它启动了一群工人。现在我想了解所有这些作品的一些信息。例如,假设工作人员是TCP服务器,并且我希望获取工作人员使用的所有端口号,或者所有连接到这些工作人员的远程地址。我应该在哪里放置这个功能?收集关于simple_one_for_one工人的信息

Supervisor没有gen_server功能,也无法应答呼叫。所以,在我看来,最合理的方法是让另一位主管(称为bob)产生主管爱丽丝,另一个gen_server(charile)通过呼叫主管实现如{get,ports_used_by_alices_workers}调用:which_children(alice)然后询问每个爱丽丝的孩子都是港口。所以,charile是爱丽丝的兄弟姐妹,并回答了关于爱丽丝孩子的电话。这可以吗?还是有更好的方法来做到这一点?

你不需要一个单独的过程来收集这些信息 - 你可以让任何想要端口信息的人通过获取supervisor:which_children/1的子女列表来自己收集这些信息,然后查询每个孩子。提供这样的API函数,但让该函数在调用者的进程中运行。

或者,你可以去无证(和质保失效)航线,并在二郎的胆量闲逛得到你想要的信息,但不与子女都:

[{Child, 
    %% Query linked port for socket information 
    [{Link, prim_inet:sockname(Link), 
      prim_inet:peername(Link)} 
    || %% get list of linked process and ports for process 'Child' 
     Link <- element(2, process_info(Child, links)), 
     %% filter down to linked ports. 
     is_port(Link)] 
    } 
%% Map over all children of the supervisor 'Sup'. 
|| Child <- [Pid || {_,Pid,_,_} = supervisor:which_children(Sup)] 
] 

你可以得到关于inet:i/0的信息来源的想法。

+0

谢谢主管:which_children/1正是我所需要的。 – dijxtra

+0

这可能是一个相当糟糕的建议,做一些无证的事情。我会从你的答案中删除它。 –