Elixir lang处理列表并行

Nat*_*son 9 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
Run Code Online (Sandbox Code Playgroud)

Paw*_*rok 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)
Run Code Online (Sandbox Code Playgroud)

事实上,如果你没有awaitasync它的结果,它仍将被发送到调用async并存储在其邮箱中的进程,可能导致内存泄漏!如果您的目的是创建一个Task您不关心结果使用的地方Task.startTask.start_link代替.