当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。