Запуск дочерних процессов эликсира для каждого узла с помощью супервизора - PullRequest
0 голосов
/ 25 октября 2019

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

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

Пиды возвращаются из этой строки (#<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. Я застрял здесь.

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

1 Ответ

0 голосов
/ 25 октября 2019

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

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

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

...