У меня есть около 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, но безрезультатно.
Может кто-нибудь помочь мне с этим? Я застрял здесь.