我有一个主管(称为alice),它启动了一堆工作人员。现在我想得到一些关于所有作品的信息。例如,假设工作者是TCP服务器,我想获得工作人员使用的所有端口号,或者连接到这些工作者的所有远程地址。我应该把这个功能放在哪里?
主管没有gen_server功能,无法接听电话。因此,在我看来,最合理的方法是让另一个主管(称为bob)产生主管alice和另一个gen_server(charile),通过调用主管来实现{get,ports_used_by_alices_workers}之类的调用:which_children(alice)然后询问每个爱丽丝的孩子都是它的港口。因此,charile是爱丽丝的兄弟姐妹,并回答有关爱丽丝孩子的电话。这可以吗?或者有更优雅的方式吗?
答案 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的来源中提供的信息。