【发布时间】: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,但看不出这里有什么问题。
【问题讨论】:
-
不应该
restart: :temporary是worker的一个选项,而不是supervise?根据:hexdocs.pm/elixir/Supervisor.html#module-simple-one-for-one
标签: elixir