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


Elixir Task.yield用法及代碼示例


Elixir語言中 Task.yield 相關用法介紹如下。

用法:

yield(task, timeout \\ 5000)
@spec yield(t(), timeout()) :: {:ok, term()} | {:exit, term()} | nil

暫時阻塞等待任務回複的調用者進程。

如果收到回複,則返回 {:ok, reply},如果沒有回複,則返回 nil,如果任務已經退出,則返回 {:exit, reason}。請記住,通常任務失敗也會導致擁有該任務的進程退出。因此,如果至少滿足以下條件之一,此函數可以返回 {:exit, reason}

超時,以毫秒或 :infinity 為單位,可以使用默認值 5000 給出。如果在收到來自任務的消息之前時間用完,此函數將返回 nil 並且監視器將保持活動狀態。因此 yield/2 可以在同一任務上多次調用。

此函數假定任務的監視器仍處於活動狀態或監視器的:DOWN 消息在消息隊列中。如果已被監控或消息已收到,該函數將等待等待消息的超時時間。

如果您打算在任務未在 timeout 毫秒內響應的情況下關閉任務,則應將其與 shutdown/1 鏈接在一起,如下所示:

case Task.yield(task, timeout) || Task.shutdown(task) do
  {:ok, result} ->
    result

  nil ->
    Logger.warn("Failed to get a result in #{timeout}ms")
    nil
end

如果您打算檢查任務但在超時後讓它繼續運行,您可以將其與 ignore/1 鏈接在一起,如下所示:

case Task.yield(task, timeout) || Task.ignore(task) do
  {:ok, result} ->
    result

  nil ->
    Logger.warn("Failed to get a result in #{timeout}ms")
    nil
end

這確保了如果任務在 timeout 之後但在 shutdown/1 被調用之前完成,您仍然會得到結果,因為 shutdown/1 旨在處理這種情況並返回結果。

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Task.yield(task, timeout \\ 5000)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。