我大约有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,但无济于事。
有人可以帮我这个忙吗?我很困在这里。