非常教程

Elixir 1.5参考手册

监督 | Supervisor

Supervisor.Spec

注意:这个模块中的函数是不推荐的,它们不适用于Elixirv1.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.Specuse Supervisor自动这么做。例如,定义基于模块的监控器对于在c:init/1回调。

主管和工人选择

在上面的例子中,我们为工人和主管定义了规格。这些规格(既适用于工作人员也适用于主管)接受以下选项:

  • :id-主管用于在内部标识子规范的名称;默认为子工作人员/主管的给定模块名称
  • :function-对子类启动该功能的调用
  • :restart - 定义何时应该重新启动终止的子进程的原子(请参见下面的“重新启动值”部分)
  • :shutdown - 定义应如何终止子进程的原子(请参见下面的“关闭值”部分)
  • :modules- 它应该是一个包含一个元素的列表[module],其中module是仅当子进程是a Supervisor或时回调模块的名称GenServer; 如果子进程是a GenEvent:modules则应:dynamic重新启动值(:restart)该:restart选项支持以下重新启动值:
  • :permanent-始终重新启动子进程
  • :temporary- 子进程永远不会重新启动(即使主管的策略是:rest_for_one或不:one_for_all
  • :transient- 子进程只有在异常终止时才会重新启动,也就是说,退出的原因不是:normal:shutdown或者是{:shutdown, term}

注意到达到最大重启强度的主管将:shutdown有理由退出。在这种情况下,只有在其:restart选项被设置为:permanent(默认)的情况下定义其子规格时,管理程序才会重新启动。

Shutdown values (:shutdown)

控件中支持下列关闭值:shutdown备选方案:

  • :brutal_kill-使用Process.exit(child, :kill)
  • :infinity-如果子进程是主管,这是一种机制,可以给子树足够的时间来关闭;它也可以与工人一起使用。
  • 任何整数-值为:shutdown也可以是任意整数,这意味着监控程序通过调用Process.exit(child, :shutdown)然后等待出口信号回来。如果在指定的时间%28(此选项的值)内没有接收到退出信号(毫秒%29),则将使用以下方法无条件终止子进程Process.exit(child, :kill)摘要类型儿童[医]ID%28%29支持的id值模块%28%29支持的模块值重启%28%29支持的重新启动值停工%28%29支持关闭值规格%28%29监事规范战略%28%29支助战略工人%28%29支持的工人价值观功能监督%28名儿童,选项%29接收子女列表%28名员工或主管%29进行监督和一组选项监控程序%28模块、ARGS、选项[医][]%29定义给定的module作为一个主管,它将以给定的参数开始。工作人员%28模块、ARGS、选项[医][]%29定义给定的module作为一个将以给定参数开始的工作人员类型儿童[医]ID%28%29child_id() :: term支持的id值模块%28%29modules() :: :dynamic | [module]支持的模块值重启%28%29restart() :: :permanent | :transient | :temporary支持的重新启动值停工%28%29shutdown() :: timeout | :brutal_kill支持关闭值规格%28%29spec() :: {child_id, start_fun :: {module, atom, [term]}, restart, shutdown, worker, modules}监事规范战略%28%29strategy :: :simple_one_for_one | :one_for_one | :one_for_all | :rest_for_one支助战略工人%28%29worker() :: :worker | :supervisor支持的工人价值观功能监督%28名儿童,选项%29supervise([spec], [strategy: strategy, max_restarts: non_neg_integer, max_seconds: pos_integer]) :: {:ok, tuple}接收子女列表%28名员工或主管%29进行监督和一组选项。返回包含主管规范的元组。此元组可用作c: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(module, [term], [restart: restart, shutdown: shutdown, id: term, function: atom, modules: modules]) :: spec

定义给定的module作为一名监督者,将以给定的论点开始。

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

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

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

检查文档中的Supervisor.Spec有关选项的更多信息。

worker(module, args, options \ [])

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有关选项的更多信息。

监督 | Supervisor相关

Elixir 1.5

Elixir 基于 Erlang 虚拟机的函数式、面向并行,是一种较好的编程语言。它以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发。

主页 https://elixir-lang.org/
源码 https://github.com/elixir-lang/elixir
版本 1.5
发布版本 1.5.2