Я хочу контролировать задачу с использованием политики повторного перезапуска, так что она перезапускается только в том случае, если она выходит из строя аномально. Однако, когда я тестировал свое приложение, я обнаружил, что он перезапускал его 4 раза, прежде чем супервизор выручил сам. Я упростил код и даже изменил его на: временный, но даже тогда супервизор перезапустил задачу.Elixir supervisor неожиданно перезапускает временного/временного работника
Упрощенный пример:
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 в течение нескольких лет, но не видит, что здесь не так.
Не следует «перезапускать:: временный» вариант «рабочий» не «контролировать»? В соответствии с: https://hexdocs.pm/elixir/Supervisor.html#module-simple-one-for-one –