【发布时间】:2018-03-13 22:34:54
【问题描述】:
只是弄乱了 elixir 结果得到了一个我无法弄清楚的错误。这是我的 sn-p,我为一些 api 调用实现了一个简单的 Parallel map 函数。 func 是进行实际调用的函数,它返回 {:ok,result} 或 {:error,reason} 我在不同函数中映射后处理
原来
def pmap(collection,func,limit \\ 5000) do
collection
|> Enum.map(&Task.async(func.(&1)))
|> Enum.map(&Task.await(&1,limit))
得到了错误,所以为了可读性把它改成了这个
def pmap(collection,func,limit) do
collection
|>Enum.map(fn(x) -> Task.async(func.(x)) end)
|>Enum.map(fn(task) -> Task.await(task,limit) end)
我得到状态的错误
[error] Task #PID<0.197.0> started from #PID<0.187.0> terminating
** (BadFunctionError) expected a function, got: {:ok,result}
erlang.apply/2
(elixir) lib/task/supervised.ex:85: Task.Supervised.do_apply/2
(elixir) lib/task/supervised.ex:36: Task.Supervised.reply/5
(stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
Function: &:erlang.apply/2
据我所知,假设实际的任务集合元素作为函数传递
所以我把函数修改为
IO.puts "PMAP BEGUN"
tasks = collection
|> Enum.map(fn(x) -> Task.async(func.(x)) end)
answer = Enum.map(tasks,fn(task) -> Task.await(task,limit) end)
IO.puts "PMAP DONE"
answer
IO.puts 用于调试。所以我猜错误发生在第二张地图上,因为 PMAP DONE 永远不会显示。我仍然有同样的错误。
这里到底出了什么问题?我之前几乎一字不差地写过同样的函数,它确实有效。
【问题讨论】:
标签: functional-programming erlang elixir phoenix-framework