# How run multiple worker based on dynamic supervisor

**URL:** <https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245>\
**Category:** Questions\
**Tags:** erlang\
**Created:** [September 8, 2019, 12:51am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245 "2019-09-08T00:51:43Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Shantanu48114860](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/shantanu48114860/32/16659_2.png) [@Shantanu48114860](https://forum.elixirforum.com/u/Shantanu48114860)\
**Post date:** [September 8, 2019, 12:51am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245/1 "2019-09-08T00:51:43Z")

</div>

I have following DynamicSupervisor:

```elixir
defmodule Vampire_supervisor do
  use DynamicSupervisor

  def start_link() do
    DynamicSupervisor.start_link( __MODULE__ , :ok)
    # Supervisor.start_link( __MODULE__ , {limits, low, high})
  end

  def init(:ok) do
    DynamicSupervisor.init(strategy: :one_for_one)
  end

  def start_worker(super_pid) do
    child_spec = {Vampire_finder, []}
    DynamicSupervisor.start_child(super_pid, child_spec)
  end
end

```

Vampire\_finder is a genserver module as follows:

```elixir
defmodule Vampire_finder do
  use GenServer

  ## External API
  def start_link([]) do
    GenServer.start( __MODULE__ , [], name: __MODULE__ )
  end

  def cal_vampire({pid, low, high}) do
    # GenServer.call(pid, :next_number)
    GenServer.cast(pid, {:set_number, low, high})
  end

  def get_vampire(pid) do
    GenServer.call(pid, :next_number)
  end

  ## GenServer Implementation
  def handle_call(:next_number, _from, all_vampire_nums) do
    #all_vampire_nums = VampireNumbers.get_vampire_nums(low, high)
    {:reply, all_vampire_nums, all_vampire_nums}
  end

  def handle_cast({:set_number, low, high}, _) do
    all_vampire_nums = VampireNumbers.get_vampire_nums(low, high)
    {:noreply, all_vampire_nums}
  end

end

```

When I am trying to call the supervisor using  
{:ok, super\_pid} = Vampire\_supervisor.start\_link()  
IO.inspect super\_pid  
Vampire\_supervisor.start\_worker(super\_pid)  
Vampire\_supervisor.start\_worker(super\_pid)

For the second startworker i am getting an error  
{:error, {:already\_started, #pid\<0.230.0\>}}

Can someone plz help?

---

<div class="post-metadata">

**Author:** ![kokolegorille](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kokolegorille/32/4784_2.png) [@kokolegorille](https://forum.elixirforum.com/u/kokolegorille)\
**Post date:** [September 8, 2019, 2:19am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245/2 "2019-09-08T02:19:47Z")

</div>

Well, if You don’t mind I can help You in reformatting your post code by adding around ``` as markdown sign for code 🙂

---

<div class="post-metadata">

**Author:** ![kokolegorille](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kokolegorille/32/4784_2.png) [@kokolegorille](https://forum.elixirforum.com/u/kokolegorille)\
**Post date:** [September 8, 2019, 2:27am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245/3 "2019-09-08T02:27:16Z")

</div>

> [@Shantanu48114860](#):
>
> name: **MODULE**

That is problematic with dynamic supervisor’s workers because You can have only one process per name. You should use something like Registry (local), or go for :global (distributed).

Here is an example with Registry… as You might guess, name should be unique.

```elixir
  def start_link(name, args \\ %{}) do
    GenServer.start_link( __MODULE__ , args, name: via_tuple(name))
  end

  defp via_tuple(name), do: {:via, Registry, {Registry.WorldWorkers, name}}

```

and add registry to your supervision tree

```elixir
{Registry, keys: :unique, name: Registry.WorldWorkers},

```

You can also add this helper function to your worker.

```elixir
  def whereis_name(name) do
    case Registry.lookup(Registry.WorldWorkers, name) do
      [{pid, _ref}] -> pid
      [] -> nil
    end
  end

```

---

<div class="post-metadata">

**Author:** ![Shantanu48114860](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/shantanu48114860/32/16659_2.png) [@Shantanu48114860](https://forum.elixirforum.com/u/Shantanu48114860)\
**Post date:** [September 8, 2019, 3:13am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245/4 "2019-09-08T03:13:06Z")

</div>

How to close this question as the issue is resolved?

---

<div class="post-metadata">

**Author:** ![Shantanu48114860](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/shantanu48114860/32/16659_2.png) [@Shantanu48114860](https://forum.elixirforum.com/u/Shantanu48114860)\
**Post date:** [September 8, 2019, 3:13am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245/5 "2019-09-08T03:13:10Z")

</div>

No, problem, it is done. I made a small mistake, really appreciate your help.

---

<div class="post-metadata">

**Author:** ![kokolegorille](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kokolegorille/32/4784_2.png) [@kokolegorille](https://forum.elixirforum.com/u/kokolegorille)\
**Post date:** [September 8, 2019, 3:14am UTC](https://forum.elixirforum.com/t/how-run-multiple-worker-based-on-dynamic-supervisor/25245/6 "2019-09-08T03:14:11Z")

</div>

You can go on a post, click on show more (…) and mark it as solution to close the topic.

Glad it helped 🙂
