In addition to links and monitors, Erlang pioneered an application of links called “supervisors”.
Support for supervision is experimental.
A supervisor is an actor which holds specifications describing the construction and maintenance of other, supervised (“child”), actors.
When a supervised actor terminates, the supervisor restarts it, following the specification associated with it when it was added to the supervisor.
Erlang has a rich suite of supervisor behaviors; so far, this library
includes only a very simple
Supervisor class that offers the ability
to restart child actors after they terminate, so long as either they
terminate normally (with
nil exit reason) or they do not terminate
abnormally more frequently than a configured limit.
We will create a
Supervisor that supervises a
s := Supervisor spawn. s instantiateSpec: [ | a | a := DemoSocketTerminal spawn. a async open. a ].
Executing these commands will lead to a
on the screen.
Closing the window leads to a replacement being created after the window has closed. The supervisor is re-evaluating the “specification” block supplied to it each time the supervisee terminates.
s intensity: 2 period: 5 seconds.
This configures the supervisor to terminate itself if its supervisees exceed a restart rate of two restarts within a five-second window.
DemoSocketTerminal counts as a normal termination; we
will have to get creative to simulate an abnormal termination.
Executing the following a few times in rapid succession will do the trick:
s blocking children do: [:a | a kill ].
The result is that, after a few restarts of the “failed” actor, the
supervisor itself terminates with a