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


Elixir Task.async用法及代碼示例


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-lang.org大神的英文原創作品 Task.async(fun)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。