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 Task.yield用法及代碼示例
- Elixir Task.Supervisor.async_stream用法及代碼示例
- Elixir Task.async用法及代碼示例
- Elixir Task.await_many用法及代碼示例
- Elixir Task.Supervisor用法及代碼示例
- Elixir Task.completed用法及代碼示例
- Elixir Task.Supervisor.start_child用法及代碼示例
- Elixir Task.async_stream用法及代碼示例
- Elixir Task.Supervisor.async_nolink用法及代碼示例
- Elixir Task.Supervisor.start_link用法及代碼示例
- 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.yield_many(tasks, timeout \\ 5000)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。