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


Elixir Task.Supervisor.async_nolink用法及代码示例


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 行为的兼容性

如果您在像 GenServer 这样的 OTP 行为中使用 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-lang.org大神的英文原创作品 Task.Supervisor.async_nolink(supervisor, fun, options \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。