defmodule LocationSimulator.DynamicSupervisor do @moduledoc """ DynamicSupervisor, uses for add worker in runtime. Module uses PartitionSupervisor to improve performance when start workers. """ use DynamicSupervisor require Logger @spec start_link(any) :: :ignore | {:error, any} | {:ok, pid} def start_link(init_arg) do DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__) end @impl true @spec init(any) :: {:ok, %{ extra_arguments: list, intensity: non_neg_integer, max_children: :infinity | non_neg_integer, period: pos_integer, strategy: :one_for_one }} def init(_init_arg) do DynamicSupervisor.init(strategy: :one_for_one) end @spec start_simulator(maybe_improper_list) :: :ok def start_simulator(workers) when is_list(workers) do Logger.debug("start worker: #{inspect workers}") Enum.each(workers, fn spec -> DynamicSupervisor.start_child( {:via, PartitionSupervisor, {LocationSimulator.DynamicSupervisor, self()}}, spec ) end) end end