【问题标题】:Elixir supervisor is restarting a temporary/transient worker unexpectedlyElixir 主管意外重新启动临时/临时工作人员
【发布时间】:2017-02-07 17:05:51
【问题描述】:

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

简化示例:

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

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

几年来一直在使用 Elixir,但看不出这里有什么问题。

【问题讨论】:

标签: elixir


【解决方案1】:

我刚刚在本地检查过,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

祝你好运!

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 2016-08-16
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多