当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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