Elixir的并行映射算法

时间:2016-06-27 10:44:05

标签: elixir

我目前正在研究"编程Elixir"书,刚发现这个" map"并行实施:

ResponseBeam rBeam = //Retrofit response here.
JsonObject requiredJsonObject = new JsonObject();
requiredJsonObject.put("value", rBeam.getData().getValue());

Log.d(TAG, requiredJsonObject);

对代码的评论说:"注意它如何在接收块中使用defmodule Parallel do def pmap(collection, fun) do me = self collection |> Enum.map(fn (elem) -> spawn_link fn -> (send me, { self, fun.(elem) }) end end) |> Enum.map(fn (pid) -> receive do { ^pid, result } -> result end end) end end 来依次获得每个PID的结果。如果没有这个,我们会以随机顺序取回结果。"。有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:5)

^被称为pin运算符。它与变量的先前值匹配,而不是将其重新绑定到新值。所以:

receive do
  {pid, result} -> result
end

接收{whatever, whatever}形式的任何消息,并从该元组返回第二个元素。但

receive do
  {^pid, result} -> result
end

接收任何元组消息,第一个元素是存储在pid中的确切值。