查看源代码 Supervisor.Spec (Elixir v1.16.2)
构建子进程规范的过时函数。
此模块中的函数已弃用,它们不适用于 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 是回调模块的名称,仅当子进程是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)
无条件终止子进程
摘要
函数
接收要主管的 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
支持的工作进程值
函数
@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
模块,以详细了解可用的策略。
@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
模块中的“主管和工作进程选项”部分,以详细了解可用的选项。
@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
模块中的“主管和工作进程选项”部分,以详细了解可用的选项。