Запуск дочерних процессов эликсира для каждого узла с помощью супервизора

Я пытаюсь ввести количество узлов и запустить процессы genserver для каждого из узлов; то есть каждый GenServer.start_link(n) (где n — номер узла) запускает отдельный процесс (PID) для каждого процесса.

pids = Enum.map(1..totalnodes, fn n ->
  {:ok, unit} = GenSerModule.start_link(n)
  unit
end)

PID возвращаются из этой строки (#<12.2.2.1>, #<12.2.2.2> и т. д.).

Теперь я хочу запустить узлы под супервизором. То есть я должен запустить процессы genserver через функцию инициализации Supervisor для каждого узла и получить PID. Что-то вроде этого: (я знаю, что это неправильно)

pids = Enum.map(1..totalNodes, fn n ->
  {:ok, unit} = worker(GenServerModule, n)
  unit
end)
Supervisor.init(nodeMap,[strategy: :one_for_one])

Я хочу получить PID запущенных дочерних процессов в этой функции, где я запускаю дочерние процессы через Supervisor. Я застрял здесь.

Как мне это сделать?


person Skadoosh    schedule 25.10.2019    source источник


Ответы (1)


Supervisor.Spec.worker/3, помимо того, что он устарел, не выполняет никаких действий , он возвращает кортеж дочерней спецификации .

Когда нужно динамически запускать воркеры под наблюдением, они обычно используют DynamicSupervisor.

Но если под узлами вы подразумеваете удаленные узлы, невозможно контролировать удаленные процессы, потому что (помимо многих других проблем) это нарушает отказоустойчивость (VM не может гарантировать, что другая VM когда-либо будет работать).

person Aleksei Matiushkin    schedule 25.10.2019