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)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。