异步任务未返回任何结果

时间:2019-05-21 12:10:42

标签: async-await elixir ecto phoenix

我大约有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,但无济于事。

有人可以帮我这个忙吗?我很困在这里。

0 个答案:

没有答案