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")

两者之间的差异可以在不同的地方找到。这可能是一个好的开始