{: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
,一旦他们的工作完成就会启动多个进程,并在失败时重新启动它们?
您只需要使用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,分发和主管提供了良好的基础。
编辑:我刚刚检查了这本书,找不到任何关于重新启动任务的信息,只是进程。