Создайте супервизор, который запускается:
- 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
?