2010-11-13 3 views
2

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

+0

Можете ли вы дать более подробную информацию: при повторном запуске вы хотите повторно собрать/перерасчитать аргументы или вы хотите сохранить аргументы где-то и повторно использовать их? Лучшая практика зависит от конкретного случая использования, которого я боюсь. –

+1

Я бы также добавил, что я думаю, что данные от супервизора должны быть более постоянного типа. Я бы не занимался крупномасштабной инициализацией в супервизоре, если бы это не было чем-то полезным для всех/большинства его работников. Данные для одного работника я бы ушел на его инициализацию. Просто мое мнение. – rvirding

+0

Да, спасибо, наверное, вопросы о «лучших практиках» будут трудно ответить иногда, не давая личного мнения. Полезно в любом случае. – JoGr

ответ

2

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

Смежные вопросы