2012-03-19 7 views
0

スーパーバイザーの子としていくつかのプロセスを開始したいと考えています。再起動戦略はone_for_oneです。私の必要に応じて、終了するすべてのプロセスは、一定の時間(たとえば20秒)後に再起動する必要があります。スーパーチャージャーの再起動戦略

どうすればいいですか?おそらく、initまたはterminate関数の遅延が次のものと組み合わせて:

Shutdown = brutal_kill | integer() >=0 | infinity 

もっと良い方法がありますか?

答えて

3

これにはinit/1を使用しないでください。 initが実行されている間、スーパーバイザはブロックされます。すぐにプロセスを開始する方が良いですが、20秒待ってからこのような操作のために登録するようにしてください。初期起動時に単純なerlang:send_after(..)呼び出しを使用して、この起動遅延を引き起こすことができます。

私は終了の事も気に入らない。おそらく、終了する前にちょっと待っているクローズダウン状態になっているかもしれません。これは、あなたがやっている間に誰も実行しないことをおそらく確かめることができます。私は、あなたがいつ閉じるのかをコントロールしているなら、それをお勧めします。単にこの状態に入り、上記のようなタイマートリガーを待つだけです。ただし、このソリューションでは、明示的に解放されない限り、猶予期間(ファイル、ETSテーブル、ソケット)の後にのみ外部リソースを解放します。