首页 > 解决方案 > 异步任务不返回结果

问题描述

我有大约 10-15 个 ecto 查询,我想在我的 API 代码中异步运行。我正在使用 Task.async 和 Task.yeild_many

以下是异步任务的代码 -

def get_tasks() do
  task_1 =
      Task.async(SomeModule, :some_function, [
          param_1,
          param_2
      ])

  task_2 =
      Task.async(SomeModule, :some_function, [
          param_1,
          param_2
      ])

  task_3 =
      Task.async(SomeModule, :some_function, [
          param_1,
          param_2
      ])

  [task_1, task_2, task_3]
end

我的主要功能中的任务是-

        [
          {_, task_1},
          {_, task_2},
          {_, task_3}
        ] =
          [
            task_1,
            task_2,
            task_3,
          ]
          |> MyCode.TaskHelper.yeild_multiple_tasks()

我的任务助手代码如下 -

defmodule MyCode.TaskHelper do

  def get_results_or_shutdown(tasks_with_results) do
    Enum.map(tasks_with_results, fn {task, res} ->
      res || Task.shutdown(task, :brutal_kill)
    end)
  end

  @doc """
  Returns the result of multiple tasks ran parallely

  ## Parameters
    - task_list: list, a list of all tasks
  """
  def yeild_multiple_tasks(task_list) do
    task_list
    |> Task.yield_many()
    |> get_results_or_shutdown()
  end
end

每个任务都是 ecto 查询。问题是任务的行为是随机的。有时他们返回结果,有时他们不返回。但是没有时间所有任务都有返回结果(出于代表性目的,我写了 3 个任务,但我有大约 10-15 个异步任务)。我同步运行代码,它返回了正确的结果(显然)。我尝试将配置中的 pool_size 更改为 Repo 的 50,但无济于事。

有人可以帮我解决这个问题吗?我被困在这里了。

标签: async-awaitelixirectophoenix

解决方案


推荐阅读