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 Supervisor.Spec.worker用法及代码示例
- Elixir Supervisor.Spec.supervise用法及代码示例
- Elixir Supervisor.Spec.supervisor用法及代码示例
- Elixir Supervisor.child_spec用法及代码示例
- Elixir Supervisor.init用法及代码示例
- Elixir Supervisor用法及代码示例
- Elixir StringIO.flush用法及代码示例
- Elixir Stream用法及代码示例
- Elixir String.contains?用法及代码示例
- Elixir String.reverse用法及代码示例
- Elixir Stream.drop_while用法及代码示例
- Elixir String.to_integer用法及代码示例
- Elixir System.stop用法及代码示例
- Elixir Stream.map_every用法及代码示例
- Elixir Stream.iterate用法及代码示例
- Elixir String.pad_trailing用法及代码示例
- Elixir Stream.dedup_by用法及代码示例
- Elixir Stream.interval用法及代码示例
- Elixir String.split_at用法及代码示例
- Elixir String.valid?用法及代码示例
- Elixir String.replace_prefix用法及代码示例
- Elixir String.printable?用法及代码示例
- Elixir Stream.zip用法及代码示例
- Elixir System.fetch_env!用法及代码示例
- Elixir String.replace_trailing用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Supervisor.Spec。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。