2016-02-16 2 views
4
{: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, который запускает несколько процессов, которые существуют после их выполнения и перезапуска их, если они не сработают?

ответ

6

Вы просто должны использовать Task.Supervisor.start_child вместо Task.Supervisor.async_nolink иметь детей правильно перезапущены:

{:ok, tas} = Task.Supervisor.start_link(restart: :transient, max_restarts: 4) 

Task.Supervisor.start_child(tas, fn -> 1 = 2 end) 
4

Я не думаю, что Задачи - лучшая ставка за то, что вы хотите. В документах Task Docs говорится, что:

Этот модуль определяет диспетчер, который может использоваться для динамического контроля задач. За кулисами этот модуль реализуется как: simple_one_for_one supervisor, где рабочие являются временными (т. Е. Они не перезапускаются после их смерти).

и

: перезагрузка - стратегия перезапусков, может быть: временная (по умолчанию),: переходная или: постоянный. Проверьте Supervisor.Spec для получения дополнительной информации. По умолчанию временные, так как большинство задач не могут быть эффективно перезагружены после сбоя;

Вы должны изучить GenServer и построить пул рабочих, возможно, GenServer Intro. Книга Little Elixir и OTP Guide довольно хороша для этого, я читал о половине этого, и он обеспечивает хорошую основу для OTP, дистрибутива и Supervisors.

EDIT: Я только что проверил книгу и ничего не нашел о перезапуске задач, просто процессов.

Смежные вопросы