{:ok, tas} = Task.Supervisor.start_link(restart: :transient, max_restarts: 4)
a = 1
Task.Supervisor.async_nolink(tas, fn -> IO.puts "#{a}..." end)
Task.Supervisor.async_nolink(tas, fn ->
IO.puts "Not Restarting :("
1 = 2
end)
a = a + 1
Task.Supervisor.async_nolink(tas, fn -> IO.puts "#{a}.." end)
a = a + 1
Task.Supervisor.async_nolink(tas, fn -> IO.puts "#{a}.." end)
Опция restart: :transient
не имеет никакого эффекта.Как перезапустить контролируемую задачу, которая сработала
У меня есть несколько заданий Task.async(fn(x) -> fetch_info(x) end
, которые делают HTTP-запрос для получения нескольких ресурсов и имеют ошибку тайм-аута. Было бы неплохо повторить эти неудачные задачи, вместо того, чтобы использовать try
, rescue
.
Я думаю, что async_nolink
является самым близким, который я получил без сбоев процесса. Если нет способа использовать Task
, у нас есть более простой подход с использованием Supervisor
, который запускает несколько процессов, которые существуют после их выполнения и перезапуска их, если они не сработают?