如何重新启动崩溃的监督任务

Vys*_*san 4 elixir erlang-otp

{: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)
Run Code Online (Sandbox Code Playgroud)

该选项restart: :transient似乎没有任何影响.

我很少有任务 Task.async(fn(x) -> fetch_info(x) end使http请求获得多个资源,并且有超时错误.重新尝试那些失败的任务,而不是使用try,这将是很好的rescue.

我认为async_nolink是最接近我没有崩溃的过程.如果没有办法使用Task,我们是否有一个更简单的方法使用Supervisor启动多个进程,一旦他们的工作完成就存在,如果失败就重新启动它们?

小智 7

您只需使用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) 
Run Code Online (Sandbox Code Playgroud)