3

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

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

4

1 回答 1

4

您不需要单独的过程来收集此信息 - 您可以让任何想要端口信息的人自己收集它,方法是获取孩子的列表,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源中的可用信息。

于 2011-06-27T21:00:10.833 回答