当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Task.async用法及代码示例


Elixir语言中 Task.async 相关用法介绍如下。

用法:

async(fun)
@spec async((() -> any())) :: t()

启动必须等待的任务。

fun 必须是 zero-arity 匿名函数。此函数生成一个链接到调用者进程并由其监视的进程。返回包含相关信息的 Task 结构。开发人员最终必须在返回的任务上调用 Task.await/2 Task.yield/2 ,然后调用 Task.shutdown/2

阅读 Task 模块文档,了解有关异步任务一般用法的更多信息。

链接

此函数生成一个链接到调用者进程并由其监视的进程。链接部分很重要,因为如果父进程死亡,它会中止任务。它还保证了 async/await 之前的代码在添加 async 调用后具有相同的属性。例如,假设你有这个:

x = heavy_fun()
y = some_fun()
x + y

现在你想让 heavy_fun() 异步:

x = Task.async(&heavy_fun/0)
y = some_fun()
Task.await(x) + y

和以前一样,如果heavy_fun/0 失败,整个计算都会失败,包括调用者进程。如果您不希望任务失败,那么您必须更改heavy_fun/0 代码,就像您没有异步调用时实现它一样。例如,返回 {:ok, val} | :error 结果,或者在更极端的情况下,使用 try/rescue 。换句话说,异步任务应该被认为是调用者进程的扩展,而不是一种将其与所有错误隔离的机制。

如果您不想将调用者链接到任务,则必须使用带有 Task.Supervisor 的监督任务并调用 Task.Supervisor.async_nolink/2

在任何情况下,请避免以下任何情况:

  • :trap_exit 设置为 true - 仅在特殊情况下才应使用捕获退出,因为它会使您的进程不仅不受任务退出,而且不受任何其他进程的影响。

    此外,即使在捕获退出时,如果任务已终止而没有将其结果返回,则调用await 仍将退出。

  • 取消链接以 async /await 开始的任务进程。如果您取消链接进程并且该任务不属于任何主管,您可能会留下悬空任务以防调用者进程死亡。

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Task.async(fun)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。