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