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


Elixir Task.yield_many用法及代碼示例


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

用法:

yield_many(tasks, timeout \\ 5000)
@spec yield_many([t()], timeout()) :: [{t(), {:ok, term()} | {:exit, term()} | nil}]

在給定的時間間隔內產生多個任務。

此函數接收任務列表並在給定的時間間隔內等待它們的回複。它返回一個雙元素元組的列表,任務作為第一個元素,產生的結果作為第二個元素。返回列表中的任務將與 tasks 輸入參數中提供的任務的順序相同。

yield/2 類似,每個任務的結果將是

  • {:ok, term} 如果任務在給定的時間間隔內成功報告了它的結果
  • {:exit, reason} 如果任務已經死亡
  • nil 如果任務繼續運行超過超時

超時,以毫秒或 :infinity 為單位,可以使用默認值 5000 給出。

檢查 yield/2 了解更多信息。

示例

Task.yield_many/2 允許開發人員生成多個任務並檢索在給定時間範圍內收到的結果。如果我們將它與 Task.shutdown/2 (或 Task.ignore/1 )結合起來,它允許我們收集這些結果並取消(或忽略)沒有及時回複的任務。

讓我們看一個例子。

tasks =
  for i <- 1..10 do
    Task.async(fn ->
      Process.sleep(i * 1000)
      i
    end)
  end

tasks_with_results = Task.yield_many(tasks, 5000)

results =
  Enum.map(tasks_with_results, fn {task, res} ->
    # Shut down the tasks that did not reply nor exit
    res || Task.shutdown(task, :brutal_kill)
  end)

# Here we are matching only on {:ok, value} and
# ignoring {:exit, _} (crashed tasks) and `nil` (no replies)
for {:ok, value} <- results do
  IO.inspect(value)
end

在上麵的示例中,我們創建了從 1 到 10 秒睡眠的任務,並返回它們睡眠的秒數。如果您一次執行所有代碼,您應該看到打印了 1 到 5,因為這些是在給定時間內已回複的任務。使用 Task.shutdown/2 調用將關閉所有其他任務。

相關用法


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