Асинхронные задачи не возвращают результатов - PullRequest
0 голосов
/ 21 мая 2019

У меня есть около 10-15 экто-запросов, которые я хочу запустить асинхронно в своем коде 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

Каждое задание является экто-запросом. Проблема в том, что задачи ведут себя случайным образом. Иногда они возвращают результаты, иногда нет. Но не было времени, когда все задачи давали результаты (для наглядности я написал 3 задачи, но у меня есть около 10-15 асинхронных задач). Я запустил код синхронно, и он вернул правильные результаты (очевидно). Я попытался изменить pool_size в конфигурации до 50 для Repo, но безрезультатно.

Может кто-нибудь помочь мне с этим? Я застрял здесь.

...