Elixir主管意外地重新启动临时/临时工

时间:2017-02-07 08:43:01

标签: elixir

我想使用:transient restart策略监督任务,只有在异常退出时才会重新启动它。然而,当我测试我的应用程序时,我发现它重新启动它4次,然后主管拯救了自己。我简化了代码,甚至将重启更改为:临时,但即使这样,主管也在重新启动任务。

简化示例:

defmodule FooSup do
  use Supervisor

  def start_link() do
    IO.puts "starting #{__MODULE__}"
    Supervisor.start_link(__MODULE__, {})
  end

  def init(_)do
    children = [worker(Task, [fn -> IO.puts("task running") end])]
    supervise(children, strategy: :one_for_one, restart: :temporary)
  end
end 

当我启动FooSup过程时,我得到以下输出:

iex(2)> FooSup.start_link()
starting Elixir.FooSup
task running
{:ok, #PID<0.215.0>}
task running
task running
task running

顺便说一句,我知道如果我想动态监督:临时任务我可以使用TaskSupervisor,但我想要静态监督:瞬态。

几年来一直使用Elixir,但不知道这里有什么问题。

1 个答案:

答案 0 :(得分:2)

我刚刚在本地查看过,restart应该是worker而不是supervise的选项,所以看起来应该是这样的:

defmodule FooSup do
  use Supervisor

  def start_link() do
    IO.puts "starting #{__MODULE__}"
    Supervisor.start_link(__MODULE__, {})
  end

  def init(_)do
    children = [worker(Task, [fn -> IO.puts("task running") end], restart: :temporary)]
    supervise(children, strategy: :one_for_one)
  end
end 

更多信息可以在这里找到:https://hexdocs.pm/elixir/Supervisor.html#module-simple-one-for-one

祝你好运!