Elixir simple_one_for_one Supervisors

Supervision trees are awesome. For a while I was a bit confused as to how to use the simple_one_for_one supervision strategy. Let’s look at it step by step by creating a simple bank account from which we can deposit and withdraw money.

Create a mix project: mix new bank.


Go into the project, and let’s start by creating our bank account module in lib/bank/account.ex. We’ll use Elixir’s excellent Agent abstraction.


Our Account is very simple. We can deposit money, withdraw money, and check the balance. We “open” or create an account with our start_link and get a pid back. Let’s take it for a quick spin in iex.


Excellent! Now what we would like to do is to have a supervisor that could supervise any number of bank accounts.

Let’s create that supervisor in lib/bank/account/supervisor.ex. We’ll use the Supervisor behaviour.


Awesome. We have a start_link, with which we start the supervisor. It’ll be retrievable by name (should we want to reference it without its pid), and when we call start_account on it, it will create a new Bank.Account child process. The magic for us is in the init function. There we define the supervision strategy :simple_one_for_one which allows us to dynamically attach children to our supervisor.

I also used a :temporary restart strategy when declaring the worker, but you don’t have to use that. You could set that to :normal. The :temporary option makes it so that the supervisor will not restart the worker when it dies. This was just something I was experimenting with.

Alright, let’s take it for a spin. Hit iex -S mix in the terminal,


Ok, so we have our supervisor and its chilren processes working. But I would like the supervisor to be started automatically when the application starts. Let’s do that!

We’re gonna set up our Bank module to be automatically started when the application starts. Open up lib/bank.ex in your text editor, and type the following,


Nice, we use the Application behaviour and define the start callback. Now all we have left to do is to tell mix to start this up during application start up. Pop open mix.exs, and define a mod under application function,


Last step: back to iex -S mix! Let’s jump in and type :observer.start.


Wow! Our supervisor is there. But… where are our children processes? Well, they’re dynamic! Back to the console to create a bunch of accounts!


Now that we’ve created them, let’s take a look back in the observer window.


That is awesome! That has to be the coolest thing you’ve seen in days.

For more resources, check out the getting started guide for supervisors, take a look at the Supervisor documentation, or read Programming Phoenix.