0

特定のスーパーバイザーの子として、いくつかのプロセスを開始したいと思います。再起動の戦略は次のとおりですone_for_one。私のニーズでは、終了するすべてのプロセスは、指定された時間(たとえば、20秒)後に再起動する必要があります。

これはどのように行うことができますか?たぶん、initまたはterminate関数に次の組み合わせで遅延が発生します。

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

これを達成するためのより良い方法はありますか?

4

1 に答える 1

3

これには使用しないでくださいinit/1。initの実行中、スーパーバイザはブロックされます。プロセスをすぐに開始することをお勧めしますが、20秒間待機した後でのみ、このような操作に自分自身を登録させてください。initで単純なerlang:send_after(..)呼び出しを使用して、この起動遅延をトリガーできます。

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

于 2012-03-19T14:51:42.343 に答える