Erlang Supervisor перезапустить стратегию - PullRequest
0 голосов
/ 19 марта 2012

Я хотел бы запустить несколько процессов в качестве дочерних элементов данного супервизора. Стратегия перезапуска - one_for_one. Для моих нужд каждый процесс, который завершается, должен быть перезапущен через определенный промежуток времени (например, 20 секунд).

Как это можно сделать? Может быть, с задержкой в ​​функциях инициализации или завершения в сочетании с:

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

Есть ли лучший способ добиться этого?

1 Ответ

3 голосов
/ 19 марта 2012

Не используйте init/1 для этого.Во время работы init супервизор заблокирован.Лучше сразу запустить процесс, но разрешить ему регистрироваться для таких операций только после того, как он подождет 20 секунд.Вы можете использовать простой erlang:send_after(..) вызов в инициализации, чтобы вызвать эту задержку запуска.

Мне тоже не нравится завершение.Возможно, у вас есть закрытое состояние, в котором вы немного задержитесь до завершения.Это, возможно, может гарантировать, что никто больше не бегает, пока вы делаете.Я бы порекомендовал это, если вы контролируете, когда закрывать.Просто войдите в это состояние и затем дождитесь срабатывания таймера, как указано выше.Обратите внимание, что это решение освободит внешние ресурсы только по истечении льготного периода (файлы, таблицы ETS, сокеты) - если не будет явно освобождено.

...