收集关于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的信息来源的想法。
谢谢主管:which_children/1正是我所需要的。 – dijxtra
这可能是一个相当糟糕的建议,做一些无证的事情。我会从你的答案中删除它。 –