我目前在elixir中并行处理列表时遇到问题。并行性的原因是我将结果保存到API中,如果我立即将它们全部爆炸,它会得到DDOS并关闭。
下面的代码应该分割SQL
查询的结果并处理单独任务中的每一行,并且当所有任务都已完成时,它应该终止。
在触发消息后,第一个任务会导致脚本终止。我已经看到了他们将接收放在一个函数中的答案,并且该函数一遍又一遍地调用自己,但我觉得必须有另一种更好的方法来处理它。
results = Enum.chunk(results, 500)
# Give this process a name
Process.register(self(), :core)
# Loop over the chunks making a process for each
Enum.each results, fn(result) ->
task = Task.async(fn -> Person.App.process(result, "Test", "1") end)
end
# And listen for messages
receive do
{:hello, msg} -> IO.inspect msg
{:world, _} -> "won't match"
end
答案 0 :(得分:12)
使用Task.async
时,最方便的是使用Task.await
获取结果:
results
|> Enum.map(fn result -> Task.async(fn -> Person.App.process(result, "Test", "1") end) end)
|> Enum.map(&Task.await/1)
|> Enum.each(&IO.inspect/1)
事实上,如果你不await
async
的结果,它仍会被发送到调用async
并存储在其邮箱中的进程,可能导致内存泄漏!如果您打算使用Task
或Task.start
创建一个您不关心结果的Task.start_link
。