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


{: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 请求以获取多个资源,并且有超时错误。最好重试那些失败的任务,而不是使用 tryrescue

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

您只需要使用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) 

我不认为任务是你想要的东西的最佳选择。在文档任务文档中说:

该模块定义了一个主管,可用于动态监督任务。在后台,该模块作为 :simple_one_for_one 主管实现,其中工人是临时的(即他们死后不会重新启动(。

:restart - 重启策略,可以是 :临时(默认值(、:瞬态或:p。查看主管规范以获取更多信息。默认为临时,因为大多数任务在崩溃后无法有效重新启动;

你应该研究GenServer并建立一个工人库,也许是GenServer Intro。《小灵药和OTP指南》这本书在这方面非常好,我已经读了大约一半,它为OTP,分发和主管提供了良好的基础。

编辑:我刚刚检查了这本书,找不到任何关于重新启动任务的信息,只是进程。

最新更新