Elixir语言中 Task.Supervisor.async_nolink
相关用法介绍如下。
用法:
async_nolink(supervisor, fun, options \\ [])
@spec async_nolink(Supervisor.supervisor(), (() -> any()), Keyword.t()) :: Task.t()
启动一个可以等待的任务。
supervisor
必须是
中定义的引用。该任务不会链接到调用者,有关详细信息,请参阅Supervisor
。Task.async/3
如果 supervisor
已达到最大子节点数,则会引发错误。
选项
:shutdown
-:brutal_kill
如果必须在关闭时直接终止任务或指示超时值的整数,则默认为 5000 毫秒。
与 OTP 行为的兼容性
如果您在像
这样的 OTP 行为中使用 GenServer
async_nolink
创建任务,则应该匹配来自
回调中任务的消息。GenServer.handle_info/2
任务发送的回复将采用 {ref, result}
格式,其中 ref
是任务结构持有的监视器引用,result
是任务函数的返回值。
请记住,无论使用async_nolink
创建的任务如何终止,调用者的进程将始终收到一个:DOWN
消息,该消息具有与任务结构保持的相同ref
值。如果任务正常终止,:DOWN
消息中的原因将是 :normal
。
例子
通常,当有合理的预期任务可能会失败并且您不希望它取消调用者时,您会使用
。让我们看一个示例,其中 async_nolink/3
旨在运行单个任务并跟踪其状态:GenServer
defmodule MyApp.Server do
use GenServer
# ...
def start_task do
GenServer.call(__MODULE__, :start_task)
end
# In this case the task is already running, so we just return :ok.
def handle_call(:start_task, _from, %{ref: ref} = state) when is_reference(ref) do
{:reply, :ok, state}
end
# The task is not running yet, so let's start it.
def handle_call(:start_task, _from, %{ref: nil} = state) do
task =
Task.Supervisor.async_nolink(MyApp.TaskSupervisor, fn ->
...
end)
# We return :ok and the server will continue running
{:reply, :ok, %{state | ref: task.ref}}
end
# The task completed successfully
def handle_info({ref, answer}, %{ref: ref} = state) do
# We don't care about the DOWN message now, so let's demonitor and flush it
Process.demonitor(ref, [:flush])
# Do something with the result and then return
{:noreply, %{state | ref: nil}}
end
# The task failed
def handle_info({:DOWN, ref, :process, _pid, _reason}, %{ref: ref} = state) do
# Log and possibly restart the task...
{:noreply, %{state | ref: nil}}
end
end
相关用法
- Elixir Task.Supervisor.async_stream用法及代码示例
- Elixir Task.Supervisor.start_child用法及代码示例
- Elixir Task.Supervisor.start_link用法及代码示例
- Elixir Task.Supervisor用法及代码示例
- Elixir Task.yield_many用法及代码示例
- Elixir Task.async用法及代码示例
- Elixir Task.await_many用法及代码示例
- Elixir Task.completed用法及代码示例
- Elixir Task.yield用法及代码示例
- Elixir Task.async_stream用法及代码示例
- Elixir Task.await用法及代码示例
- 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.Supervisor.async_nolink(supervisor, fun, options \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。