4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Elixirのスーパーバイザー(Supervisor)について

Posted at

スーパーバイザー

スーパーバイザーはプロセスを監視することができ、
プロセスが終了したとき自動で再起動させることができる。

プロセスが異常終了(異常でない場合も)したとき、
strategyによって指定された手順で再起動が行われる

スーパーバイザーを記述する

スーパーバイザーのモジュールを記述する場合、
以下の要点を考慮して記述を行うこと。

  • use Supervisorを記述する
  • start_link()を実装する
  • init()を実装する

start_link

start_link()は以下のように記述する

def start_link(_) do
  Supervisor.start_link(__MODULE__, :ok)
end

init

スーパーバイザーの監視ツリーにプロセスを追加するためには、
init関数で以下の記述を行う。

  1. プロセスのモジュールをリスト化する
  2. プロセスの終了時の動作を指定して、スーパーバイザーを初期化する。

監視ツリーへの追加

例として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
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?