3

私には、たくさんの_one_for_oneワーカーを開始するスーパーバイザー(アリスと呼ばれる)がいます。それでは、すべての作品について一緒に情報を入手したいと思います。たとえば、ワーカーがTCPサーバーであり、ワーカーが使用するすべてのポート番号、またはそれらのワーカーに接続されているすべてのリモートアドレスを取得したいとします。この機能はどこに置くべきですか?

スーパーバイザーにはgen_server機能がなく、呼び出しに応答できません。したがって、私には、最も合理的な方法は、スーパーバイザーアリスを生成する別のスーパーバイザー(bobと呼ばれる)と、supervisor:which_children(alice)を呼び出してから要求することにより、{get、ports_used_by_alices_workers}などの呼び出しを実装する別のgen_server(charile)を用意することです。ポートの各アリスの子。つまり、charileはアリスの兄弟であり、アリスの子供に関する電話に応答します。それは大丈夫ですか?または、これを行うためのよりエレガントな方法はありますか?

4

1 に答える 1

4

この情報を収集するために個別のプロセスは必要ありません。ポート情報が必要な人は誰でも、子のリストを取得して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のソースで入手可能な情報のアイデアを得ることができます。

于 2011-06-27T21:00:10.833 に答える