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 Task.async_stream用法及代码示例
- Elixir Task.await_many用法及代码示例
- Elixir Task.await用法及代码示例
- Elixir Task.yield_many用法及代码示例
- Elixir Task.Supervisor.async_stream用法及代码示例
- Elixir Task.Supervisor用法及代码示例
- Elixir Task.completed用法及代码示例
- Elixir Task.Supervisor.start_child用法及代码示例
- Elixir Task.yield用法及代码示例
- Elixir Task.Supervisor.async_nolink用法及代码示例
- Elixir Task.Supervisor.start_link用法及代码示例
- Elixir Task用法及代码示例
- Elixir Time.add用法及代码示例
- Elixir Time.new用法及代码示例
- Elixir Tuple.duplicate用法及代码示例
- Elixir Time.to_erl用法及代码示例
- Elixir Tuple用法及代码示例
- Elixir Time.utc_now用法及代码示例
- Elixir Tuple.sum用法及代码示例
- Elixir Time.to_iso8601用法及代码示例
- Elixir Time.from_iso8601用法及代码示例
- Elixir Time.from_erl!用法及代码示例
- Elixir Time.from_seconds_after_midnight用法及代码示例
- Elixir Tuple.product用法及代码示例
- Elixir Time.truncate用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Task.async(fun)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。