查看源代码 Supervisor.Spec (Elixir v1.16.2)

此模块已弃用。请使用 Supervisor 模块中概述的新的子进程规范。

构建子进程规范的过时函数。

此模块中的函数已弃用,它们不适用于 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 - 定义何时应重新启动终止的子进程的原子(请参阅下面的“重启值”部分)

  • :shutdown - 定义如何终止子进程的原子(请参阅下面的“关闭值”部分)

  • :modules - 它应该是一个包含一个元素的列表 [module],其中 module 是回调模块的名称,仅当子进程是 SupervisorGenServer 时;如果子进程是 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) 无条件终止子进程

摘要

类型

支持的 ID 值

支持的模块值

支持的重启值

支持的关闭值

主管规范

支持的策略

支持的工作进程值

函数

接收要主管的 children(工作进程或主管)列表,以及一组 options

将给定的 module 定义为主管,它将使用给定的参数启动。

将给定的 module 定义为工作进程,它将使用给定的参数启动。

类型

@type child_id() :: term()

支持的 ID 值

@type modules() :: :dynamic | [module()]

支持的模块值

@type restart() :: :permanent | :transient | :temporary

支持的重启值

@type shutdown() :: timeout() | :brutal_kill

支持的关闭值

@type spec() ::
  {child_id(), start_fun :: {module(), atom(), [term()]}, restart(), shutdown(),
   worker(), modules()}

主管规范

@type strategy() :: :simple_one_for_one | :one_for_one | :one_for_all | :rest_for_one

支持的策略

@type worker() :: :worker | :supervisor

支持的工作进程值

函数

指向此函数的链接

supervise(children, options)

查看源代码
此函数已弃用。请使用 Supervisor 模块中概述的新的子进程规范。
@spec supervise([spec()],
  strategy: strategy(),
  max_restarts: non_neg_integer(),
  max_seconds: pos_integer()
) :: {:ok, tuple()}

接收要主管的 children(工作进程或主管)列表,以及一组 options

返回包含主管规范的元组。此元组可用于实现基于模块的主管时,作为 Supervisor.init/1 回调的返回值。

示例

supervise(children, strategy: :one_for_one)

选项

  • :strategy - 重启策略选项。它可以是 :one_for_one:rest_for_one:one_for_all:simple_one_for_one。您可以在 Supervisor 模块文档中了解有关策略的更多信息。

  • :max_restarts - 时间范围内允许的最大重启次数。默认为 3

  • :max_seconds - :max_restarts 应用的时间范围。默认为 5

:strategy 选项是必需的,默认情况下,在 5 秒内最多允许 3 次重启。请查看 Supervisor 模块,以详细了解可用的策略。

指向此函数的链接

supervisor(module, args, options \\ [])

查看源代码
此函数已弃用。请使用 Supervisor 模块中概述的新的子进程规范。
@spec supervisor(
  module(),
  [term()],
  restart: restart(),
  shutdown: shutdown(),
  id: term(),
  function: atom(),
  modules: modules()
) :: spec()

将给定的 module 定义为主管,它将使用给定的参数启动。

supervisor(module, [], restart: :permanent)

默认情况下,该函数 start_link 在给定的模块上调用。总的来说,选项的默认值为

[
  id: module,
  function: :start_link,
  restart: :permanent,
  shutdown: :infinity,
  modules: [module]
]

请参阅 Supervisor.Spec 模块中的“主管和工作进程选项”部分,以详细了解可用的选项。

指向此函数的链接

worker(module, args, options \\ [])

查看源代码
此函数已弃用。请使用 Supervisor 模块中概述的新的子进程规范。
@spec worker(
  module(),
  [term()],
  restart: restart(),
  shutdown: shutdown(),
  id: term(),
  function: atom(),
  modules: modules()
) :: spec()

将给定的 module 定义为工作进程,它将使用给定的参数启动。

worker(ExUnit.Runner, [], restart: :permanent)

默认情况下,该函数 start_link 在给定的模块上调用。总的来说,选项的默认值为

[
  id: module,
  function: :start_link,
  restart: :permanent,
  shutdown: 5000,
  modules: [module]
]

请参阅 Supervisor.Spec 模块中的“主管和工作进程选项”部分,以详细了解可用的选项。