Стратегия перезапуска диспетчера erlang

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

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

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

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


person user601836    schedule 19.03.2012    source источник


Ответы (1)


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

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

person I GIVE CRAP ANSWERS    schedule 19.03.2012