Aetherus

Aetherus

Alternative for Supervisor.Spec

I noticed that Spervisor.Spec is deprecated. The question is, what’s the alternative for Supervisor.Spec.worker and Spuervisor.Spec.supervisor that passes 0 or more than 1 arguments to the worker/supervisor module’s start_link?

For example, prior to Elixir 1.5, I can inline the name of an Agent so that I don’t have to define that module:

import Supervisor.Spec

children = [
  worker(Agent, [fn -> [] end, [name: MyAgent]])
]

Supervisor.start_link(children, strategy: :one_for_one)

How can I do this with the new Supervisor API since it requires to pass 2 arguments to Agent.start_link? What if I have a module whose start_link takes no arguments?

Most Liked

gon782

gon782

You can see the new spec stuff here: https://hexdocs.pm/elixir/master/Supervisor.html

To summarize, your alternatives are either the map based specification for each child, which is exactly what an OTP supervisor actually receives behind the curtain, or module based supervisors. The map based child specs were added quite late to OTP which is why the workaround with better UX was added to Elixir:

  %{
    id: Stack,
    start: {Stack, :start_link, [[:hello]]},
    ...
  }

Module based supervisors where you can do:

defmodule MyApp.Supervisor do
  # Automatically defines child_spec/1
  use Supervisor

  def start_link(arg) do
    Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
  end

  def init(_arg) do
    children = [
      {Stack, [:hello]}
    ]

    Supervisor.init(children, strategy: :one_for_one)
  end
end

Note that you can’t start a process by way of start_link/0 with the module based supervisor, because when you pass {Stack, []} or simply Stack it actually will pass [] to start_link. The map based child spec doesn’t have this issue, since you’d just pass start: {Stack, :start_link, []} to it and it’ll work just like every other place where you pass MFAs (Module, Function, Arguments) in Erlang.

gon782

gon782

I think Supervisor is one of those things that gets comparatively little scrutiny and checking up on as time passes in general, being that we can probably count the amount of times we need to sit down and write the specs for them on a couple of hands, if even that, in any given project. I’m guessing most people are used to them just being there.

The docs are generally fantastic, though, so do have a look when therë́s something you’re wondering about.

gon782

gon782

Just as a note, you can use both of the above in the same supervisor:

defmodule Downloader do
  use Application

  def start(_type, _args) do
    config_reader = %{
      id: Downloader.Config.Reader,
      start: {Downloader.Config.Reader, :start_link, []}
    }

    children = [
      Downloader.Download.Supervisor,
      Downloader.RSS.Reader.Supervisor,
      Downloader.Torrent.Filter,
      Downloader.Torrent.Store,
      config_reader,
      Downloader.RSS.Reader.Manager,
      Downloader.Notifier
    ]

    opts = [strategy: :one_for_one, name: Downloader.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

Where Next?

Popular in Questions Top

aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
jaysoifer
Is there a way to rollback a specific migration and only that one (“skipping” all the other ones)? Would mix ecto.rollback -v 200809061...
New
vegabook
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
lucidguppy
I have a super simple question about elixir - how would I take a file like this foo bar baz and output a new file that enumerates th...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New

Other popular topics Top

albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 126479 1222
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

We're in Beta

About us Mission Statement