Elixir的并行映射算法

six*_*ers 2 elixir

我目前正在编写"Programming Elixir"一书,刚刚发现这个以"并行"方式实现的"map"示例:

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
Run Code Online (Sandbox Code Playgroud)

对代码的评论说:"注意它如何^pid在接收块中依次获取每个PID的结果.如果没有这个,我们将以随机顺序返回结果." 有人可以澄清一下吗?

Paw*_*rok 5

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

receive do
  {pid, result} -> result
end
Run Code Online (Sandbox Code Playgroud)

接收表单的任何消息{whatever, whatever}并从该元组返回第二个元素.但

receive do
  {^pid, result} -> result
end
Run Code Online (Sandbox Code Playgroud)

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