Проверка существующего дочернего элемента в OTP simple_on_for_one supervisor - PullRequest
1 голос
/ 29 мая 2011

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

В настоящее время я запускаю childs в модуле supervisor следующим образом:

start_child(Key) ->
    supervisor:start_child(?SERVER, [Key]).

Я хотел бы сделать что-то вроде этого (не проверено):

start_child(Key) ->
    case supervisor:child_pid(Key) of
    Pid -> Pid;
    _ -> supervisor:start_child(?SERVER, [Key])
    end.

Что такое хороший OTP-способ узнать, есть ли уже ребенок для Key?

1 Ответ

2 голосов
/ 30 мая 2011

Создайте супервизор, который запускается:

  • A gen_server.Давайте назовем это reducer_server
  • супервизор simple_one_for_one.Давайте назовем это reducer_sup

Убедитесь, что ваш главный супервизор запускает reducer_sup до reducer_server.Состояние reducer_server может представлять собой словарь пар Key -> Pid.reducer_server тогда будет иметь такую ​​функцию, как reduce(Key), которая либо находит ключ в словаре и знает соответствующий процесс, либо не находит ключ и запускает такую ​​функцию:

new_reduce(Key) ->
    case supervisor:start_child(reducer_sup, [Key]) of
        {ok, Pid} when is_pid(Pid) -> {ok, Pid};
        {ok, Pid, _} when is_pid(Pid) -> {ok, Pid};
        _ -> error
    end.

Просто добавьтеПолученный pid в вашем штате, и вы должны быть готовы к следующему вызову reduce/1.Я бы рекомендовал прочитать this и this , чтобы лучше понять, как все эти части работают вместе.Если вы помещаете этот код в производственную среду, вы можете рассмотреть такие вещи, как:

  • Что происходит, когда процессы умирают?Подсказка: проверьте на живость с помощью is_process_alive/1.
  • Что произойдет, если умрет reducer_server или reducer_sup?
...