Elixir 的 Supervisor 配置

只有在 Elixir 模块中定义了 child_spec 方法,此模块才能被 Supervisor 监控,可以通过两种方式配置 Supervisor 的参数 children ,一种是内置模块中已经实现了 child_spec 方法,例如 gen_server, agent等,可以直接:

 children = [
      # Starts a worker by calling: Fire.Worker.start_link(arg)
      # {Fire.Worker, arg},
      {Fire, []}
    ]

另外一种是显式配置:

    children = [
      # Starts a worker by calling: Fire.Worker.start_link(arg)
      # {Fire.Worker, arg},
      # {Fire, []},
      %{
        id: Fire,
        start: {Fire, :start_link, []},
        restart: :permanent,
        shutdown: 500
      }
    ]

也可以在模块中实现 child_spec ,这样就可以直接使用上一种配置方式:{Fire, []}

defmodule Fire do

  def start_link() do
    Task.start_link(fn -> IO.puts "hello elixir" end)
  end

  def child_spec(args) do
    %{
      id: __MODULE__,
      start: {__MODULE__, :start_link, args}
    }
  end
end