スーパーバイザー
スーパーバイザーはプロセスを監視することができ、
プロセスが終了したとき自動で再起動させることができる。
プロセスが異常終了(異常でない場合も)したとき、
strategyによって指定された手順で再起動が行われる
スーパーバイザーを記述する
スーパーバイザーのモジュールを記述する場合、
以下の要点を考慮して記述を行うこと。
-
use Supervisor
を記述する -
start_link()
を実装する -
init()
を実装する
start_link
start_link()
は以下のように記述する
def start_link(_) do
Supervisor.start_link(__MODULE__, :ok)
end
init
スーパーバイザーの監視ツリーにプロセスを追加するためには、
init関数で以下の記述を行う。
- プロセスのモジュールをリスト化する
- プロセスの終了時の動作を指定して、スーパーバイザーを初期化する。
監視ツリーへの追加
例としてlibディレクトリに以下のファイルがあるものとする。
- my_supervisor.ex
- sample_process.ex
スーパーバイザーツリーに追加して監視したいプロセスを、以下のように記述してリスト化する。
children = [
# ここにプロセスモジュール名を記述する。以下は例
{SampleProcess, 値}
]
このリストは、スーパーバイザーの監視ツリーとして使用する。
スーパーバイザーを初期化するために以下を記述する
Supervisor.init(children, starategy: プロセス終了時の動作)
starategyで選択できるものには以下のものがある
- :one_for_one - 終了した子プロセスを再起動する
- :one_for_all - 子プロセスが終了する、他の子プロセスも終了させすべて再起動させる。
- :rest_for_one - 子プロセスが終了すると、その子プロセスのあとに開始したプロセスを含め終了。その後再起動する。
まとめ
ここまでをまとめると以下のようになる。またここでは、終了時の動作を:one_for_oneとしている
def init(:ok) do
children = [
# ここにプロセスモジュール名を記述する。以下は例
{SampleProcess, 値}
]
Supervisor.init(children, stararegy: :one_for_one)
en
使用方法
スーパーバイザーはネストすることができる。
したがって、Mixプロジェクトのapplication.ex内の管理ツリーに、
個別に作成したスーパーバイザーを追加することもできる。
スーパーバイザーをstart_link()
で起動させると、子プロセスも起動される。
起動された子プロセスのプロセスIDを取得するには、以下のコマンドを使用する。
Supervisor.which_children(スーパーバイザーのプロセスID)
この関数の戻り値から子プロセスのIDを取得するとよい。
以下は例
# スーパーバイザーの起動
iex>{:ok, sup} = MySuperviosr.start_link []
{:ok, #PID<0.161.0>}
# 子プロセスを取得する
iex>Supervisor.which_children sup
[
{Sample, #PID<0.163.0>, :worker, [Sample]},
{GenServerTuto, #PID<0.162.0>, :worker, [GenServerTuto]}
]
iex>[{_, pid, _, _}, _] = Supervisor.which_children sup