Supervisors play an essential role in Erlang applications: they are responsible for starting and monitoring processes.
All top-level processes in an Erlang application are managed by a supervisor. In e2, this top level supervisor is provided automatically when you use an e2_application.
Note
This section is under development. For examples of various supervisor types, see examples/supervise.
Task supervisors specialize in starting and monitoring tasks. Task supervisors automatically remove children when they’re no longer needed.
Here’s an example of a task supervisor that starts a db_read_task
(used as
the example in e2 Tasks):
-module(db_read_task_sup).
-behavior(e2_task_supervisor).
-export([start_link/0, start_reader/1]).
start_link() ->
e2_task_supervisor:start_link(?MODULE, db_read_task, [registered]).
start_reader(Db) ->
e2_task_supervisor:start_task(?MODULE, [Db]).
Note that this task supervisor specifies the registered
option in
start_link/0
. This causes the supervisor to be registered under the
?MODULE
name, which how it’s references in start_reader/1
.
To ensure that this supervisor started when the app was started, you’d include it in the application module child list. For example, modifying the example in e2 Applications:
-module(hello_app).
-behavior(e2_application).
-export([init/0]).
init() ->
{ok, [hello, {db_read_task_sup, [supervisor]}]}.
Note that we added a supervisor
list to the child spec – this tells e2 to
register the specified module as a supervisor.
Once the supervisor is started, you can use it to kick off “db read” tasks like this:
db_read_task_sup:start_reader(Db)
To understand why it’s important to use supervisors to start processes in Erlang, see the Fault Tolerance section in e2 Tutorial.