Aetherus

Aetherus

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?

Showing Posts 1 to 4

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

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
Aetherus

Aetherus OP

Thanks a lot. I feel like an idiot for not reading the documentation carefully.

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.

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
jaybe78
Hello, I’m developing a online persistent chat system (what’s app) like using elixir/dynamodb/aws for a mobile app(flutter). The diffic...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New

Other Trending Topics Top

garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews