收集有关simple_one_for_one工人的信息

时间:2011-06-27 20:00:40

标签: erlang supervisor

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

主管没有gen_server功能,无法接听电话。因此,在我看来,最合理的方法是让另一个主管(称为bob)产生主管alice和另一个gen_server(charile),通过调用主管来实现{get,ports_used_by_alices_workers}之类的调用:which_children(alice)然后询问每个爱丽丝的孩子都是它的港口。因此,charile是爱丽丝的兄弟姐妹,并回答有关爱丽丝孩子的电话。这可以吗?或者有更优雅的方式吗?

1 个答案:

答案 0 :(得分:3)

您不需要单独的流程来收集此信息 - 您可以通过获取具有supervisor:which_children/1的子项列表然后查询每个子项,让任何想要端口信息的人自己收集它。提供执行此操作的API函数,但让该函数在调用者的进程中运行。

或者,你可以去无证(和保证无效)路线,并在erlang的内容中四处寻找你想要的信息而不与孩子交谈:

[{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的来源中提供的信息。