Elixir lang处理列表并行

时间:2015-06-26 17:59:29

标签: elixir

我目前在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

1 个答案:

答案 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并存储在其邮箱中的进程,可能导致内存泄漏!如果您打算使用TaskTask.start创建一个您不关心结果的Task.start_link