當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。