當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Supervisor.Spec用法及代碼示例


Elixir語言中 Supervisor.Spec 相關用法介紹如下。

用於構建子規範的過時函數。

此模塊中的函數已棄用,它們不適用於 Elixir v1.5 中引入的基於模塊的子規範。請參閱 Supervisor 文檔。

用於定義主管規範的便利函數。

示例

通過使用此模塊中的函數,可以指定要在主管下使用的孩子,從 Supervisor.start_link/2 開始:

import Supervisor.Spec

children = [
  worker(MyWorker, [arg1, arg2, arg3]),
  supervisor(MySupervisor, [arg1])
]

Supervisor.start_link(children, strategy: :one_for_one)

有時,定義由模塊支持的主管可能很方便:

defmodule MySupervisor do
  use Supervisor

  def start_link(arg) do
    Supervisor.start_link(__MODULE__, arg)
  end

  def init(arg) do
    children = [
      worker(MyWorker, [arg], restart: :temporary)
    ]

    supervise(children, strategy: :simple_one_for_one)
  end
end

請注意,在這種情況下,我們不必顯式導入 Supervisor.Spec ,因為 use Supervisor 會自動這樣做。定義一個基於模塊的監督器可能很有用,例如,在 Supervisor.init/1 回調中執行初始化任務。

主管和工人選項

在上麵的示例中,我們為工人和主管定義了規範。這些規範(適用於工人和主管)接受以下選項:

  • :id - 主管內部用於標識子規範的名稱;默認為子工作者/主管的給定模塊名稱

  • :function - 在子節點上調用以啟動它的函數

  • :restart - 一個原子,定義何時應該重新啟動終止的子進程(請參閱下麵的 "Restart values" 部分)

  • :shutdown - 定義如何終止子進程的原子(請參閱下麵的 "Shutdown values" 部分)

  • :modules - 它應該是一個包含一個元素的列表 [module] ,其中 module 是回調模塊的名稱,僅當子進程是 Supervisor GenServer 時;如果子進程是 GenEvent :modules 應該是 :dynamic

重啟值 (:restart)

:restart 選項支持以下重啟值:

  • :permanent - 子進程總是重啟

  • :temporary - 子進程永遠不會重新啟動(即使主管的策略是 :rest_for_one:one_for_all )

  • :transient - 僅當子進程異常終止時才會重新啟動,即,退出原因不是 :normal:shutdown{:shutdown, term}

請注意,達到最大重啟強度的主管將退出 :shutdown 原因。在這種情況下,監督者隻會在其子規範定義為 :restart 選項設置為 :permanent(默認值)時重新啟動。

關機值 (:shutdown)

:shutdown 選項支持以下關閉值:

  • :brutal_kill - 使用 Process.exit(child, :kill) 無條件終止子進程

  • :infinity - 如果子進程是主管,這是一種給予子樹足夠時間關閉的機製;它也可以與小心的工人一起使用

  • 一個非負整數 - 主管通過調用 Process.exit(child, :shutdown) 告訴子進程終止然後等待退出信號返回的時間量(以毫秒為單位)。如果在指定時間內沒有收到退出信號,則使用Process.exit(child, :kill)無條件終止子進程

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Supervisor.Spec。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。