Process.sleep(7000) end) IO.insp-6ren">
gpt4 book ai didi

Elixir:救援/捕获任务超时

转载 作者:行者123 更新时间:2023-12-05 00:40:28 25 4
gpt4 key购买 nike

我有以下代码:

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

所以 await 使我的调用者进程崩溃,并且我无法通过使用“after” block 来挽救错误。我不明白如何保护我的调用者进程免受任务超时错误的影响。

最佳答案

您将希望在这个特定实例中使用 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")

"start task"
"start awaiting"
caught exit
"after"
"success ending"

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

关于Elixir:救援/捕获任务超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47947445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com