2016-05-12 3 views
0

スーパーバイザごとに(TCP)接続が必要なスーパーバイザ構造を持っています。今度は、各スーパーバイザが独自の固有の名前を必要としているように見えますが、それはアトムでなければなりません(少なくともエラーメッセージから収集しています)。固有のスーパーバイザ/サーバ名

回避策は、毎回新しい原子を生成することです(a suggestion from the erlang-questions listに似ています)。

今、私は原子が決してクリーンアップされないことを学んだので、あまりにも多くの接続によってDoSedされ、原子空間を使い果たす可能性があります。これはどのように正しく行われますか?

答えて

4

ここには、スーパーバイザーの子プロセスと識別子の登録名が2種類あります。

スーパーバイザプロセスごとに登録された名前を持つ必要はありません。スーパーバイザプロセスを開始するには、supervisor:start_link/2 and supervisor:start_link/3の2つの機能があります。 start_link/3はスーパバイザを起動して指定された名前で登録し、start_link/2はスーパバイザの名前を登録せずにスーパバイザを起動します。 (プロセスに登録された名前がない場合、参照する唯一の方法はpidを経由することです。)

スーパーバイザの子の識別子として、無制限の数の子プロセスを持つスーパーバイザがある場合(子プロセスがワーカーかスーパーバイザであるかにかかわらず)、特別再起動タイプsimple_one_for_oneを通常使用します。つまり、静的な子指定(initコールバック関数から返されるか、supervisor:start_child関数で追加された)のリストを保持する代わりに、スーパーバイザは単一の「テンプレート」子指定を持ち、supervisor:start_child関数は「匿名」子を作成します。そのテンプレート。