2012-04-20 6 views
2

複数の管理者の子をアトミックな方法で開始する必要があります。つまり、グループ内の子供のうちの1人が起動時に失敗した場合、そのうちの1人も起動する必要はありません。スーパーバイザが複数の子をアトミック操作として開始する

私は関数として、この操作を参照してください。

start_children(SupRef, ChildSpecs) 
ChildSpecs = List :: [child_spec()] 

どのように私は適切な方法でこれを実装する必要がありますか?任意の例、ライブラリなど?私の直感は、すべての子供をリストから始め、すべてが成功しているかどうかを確認し、残りの子供を殺すことは方法ではないと言います。

おそらく私のデザインに欠陥があり、本当にそのようなことをする必要はありませんか?

答えて

2

OTPのsupervisorは、one_for_all戦略でこれをサポートしています。デフォルトでは、プロセスが失敗した場合はすべてのプロセスが再開されますが、目的に応じてRestartパラメータ(たとえばtemporary)を使用して変更できます。

+0

はい、これを動的に実行したいと思います。 'start_child'で呼び出された子が失敗した場合、' one_for_all'で、このスーパーバイザの子はすべて、以前に起動したものであっても、再起動(または終了)されます。私はそれを望んでいない。私は同じリストにある子供だけを殺してもらいたいと思っています。以前に始めた子供は触れてはいけません。 – gregorej

+4

私が正しく理解していれば、複数の子供リストがあります。その中の1つが失敗した場合はリスト内のすべての子を殺すだけですが、別のリストの子には触れないようにします。 1つのスーパーバイザーをリストごとに(one_for_all戦略を使用して)、次に必要に応じてこれらのスーパーバイザーのスーパーバイザーを置くのはどうですか? – 3lectrologos

+0

私はそれについて考えました。しかし、私が子供をつけて欲しいスーパーバイザーは、すでにいくつかのワーカーノードをサポートしています。 Erlang/OTPの私の経験から、私は子供のタイプ(労働者と監督者)を混在させることはできないと私に伝えています。 – gregorej

関連する問題