我想使用: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,但不知道这里有什么问题。
答案 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
祝你好运!