我目前在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) 我试图找出将两个相同大小的列表组合到键值对映射中的最佳方法.
我一直在使用相同的函数来处理这种情况一段时间用于CSV和原始SQL查询,这些查询返回某种标题列表以及行列表.
这是我一直在使用的功能
Enum.zip(list1, list2) |> Enum.into(%{})
Run Code Online (Sandbox Code Playgroud)
例如:
# For CSVS
header = ["column1","column2","column3"]
rows = [["a","b","c"],["d","e","f"]]
Enum.each rows, fn(row) ->
# Map the header to each row field
row = Enum.zip(header, row) |> Enum.into(%{})
# Do some processing with the row
IO.inspect row
end
Run Code Online (Sandbox Code Playgroud)
elixir/erlang中是否有一个函数可以为我执行此操作,或者上面的zip /组合是最好的方法吗?
我正在使用elixir和httpc erlang模块来ping网站.我可以很好地访问网站但是当我尝试使用status_code时,我得到一个参数错误.我可以看到数据存在于错误中,但我不确定为什么会抛出错误.
我应该提供什么参数?我认为这个函数只返回一个整数,但它看起来像是期待某些东西.
:inets.start
{:ok, result} = :httpc.request(:get, {'http://www.erlang.org', []}, [], [])
result.status_code()
** (ArgumentError) argument error
:erlang.apply({'HTTP/1.1', 200, 'OK'}, :status_code, [])
Run Code Online (Sandbox Code Playgroud)