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