Elixir:救援/捕获任务超时
我有以下代码:Elixir:救援/捕获任务超时,elixir,Elixir,我有以下代码: try do IO.inspect("start task") t = Task.async(fn -> Process.sleep(7000) end) IO.inspect("start awaiting") Task.await(t) rescue e -> IO.inspect("catch error") IO.inspect(e) after IO.inspect("after") end IO.inspect("
try do
IO.inspect("start task")
t = Task.async(fn -> Process.sleep(7000) end)
IO.inspect("start awaiting")
Task.await(t)
rescue
e ->
IO.inspect("catch error")
IO.inspect(e)
after
IO.inspect("after")
end
IO.inspect("success ending")
将打印:
"start task"
"start awaiting"
"after"
00:00:03.510 [info] Application my_app exited: exited in: MyApp.Application.start(:normal, [])
** (EXIT) exited in: Task.await(%Task{owner: #PID<0.497.0>, pid: #PID<0.498.0>, ref: #Reference<0.3923892342.570949633.190577>}, 5000)
** (EXIT) time out
“启动任务”
“开始等待”
“之后”
00:00:03.510[信息]应用程序我的应用程序退出:退出时间:MyApp.Application.start(:normal,[])
**(退出)退出于:Task.await(%Task{owner:#PID,PID:#PID,ref:#Reference},5000)
**(退出)超时
所以wait使我的调用进程崩溃,我无法通过使用“after”块来挽救错误。我不明白如何保护调用方进程不受任务超时错误的影响。在这个特定实例中,您需要使用
try/catch
try do
IO.inspect("start task")
t = Task.async(fn -> Process.sleep(7000) end)
IO.inspect("start awaiting")
Task.await(t)
catch
:exit, _ -> IO.puts "caught exit"
after
IO.inspect("after")
end
IO.inspect("success ending")
两者之间的差异可以在不同的地方找到。这可能是一个很好的开始。在这个特定的实例中,您需要使用
try/catch
try do
IO.inspect("start task")
t = Task.async(fn -> Process.sleep(7000) end)
IO.inspect("start awaiting")
Task.await(t)
catch
:exit, _ -> IO.puts "caught exit"
after
IO.inspect("after")
end
IO.inspect("success ending")
两者之间的差异可以在不同的地方找到。这可能是一个好的开始