Сохранение данных, когда рабочий процесс умирает, как?

У меня есть рабочие процессы, которым нужны собранные/вычисленные данные в качестве аргументов при запуске. Затем это необходимо и при перезапуске. Где я должен поместить код инициализации? Внутри надзирателей инициировать? Или внутри модулей start_link, или init? Есть ли какие-то лучшие практики в Erlang, когда дело доходит до этого?


person JoGr    schedule 13.11.2010    source источник
comment
Можете ли вы дать более подробную информацию: при перезапуске вы хотите повторно собрать/пересчитать аргументы или вы хотите сохранить аргументы где-то и использовать их повторно? Лучшая практика зависит от конкретного варианта использования, которого я опасаюсь.   -  person Peer Stritzinger    schedule 13.11.2010
comment
Я бы также добавил, что я думаю, что данные от супервизора должны быть более постоянными. Я бы не стал выполнять крупномасштабную инициализацию в супервизоре, если бы это не было полезно для всех/большинства его работников. Данные для одного рабочего я бы оставил до его инициализации. Только мое мнение.   -  person rvirding    schedule 13.11.2010
comment
Да, спасибо, я думаю, на вопросы о лучших практиках иногда будет трудно ответить, не высказав личного мнения. Хотя полезно в любом случае.   -  person JoGr    schedule 15.11.2010


Ответы (1)


Если компонент gen_server имеет критическое состояние или состояние, которое не может быть пересчитано/повторно собрано, я обычно избегаю сохранения состояния в самом gen_server. Вместо этого я предпочитаю поддерживать состояние во внешней таблице процессов/ets. Если вы придерживаетесь этого подхода, убедитесь, что таблица ets создана внешним процессом (который, как вы уверены, не умрет), например, процессом приложения, или создайте таблицу ets в методе инициализации gen_server и используйте метод «ets:give_away/3», чтобы передать его внешнему процессу (конечно, вам нужно будет проверить, создана ли таблица уже в методе инициализации gen_server). Иначе таблица ets будет уничтожена. когда процесс умирает..

person arun_suresh    schedule 15.11.2010