我目前正在编写"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的结果.如果没有这个,我们将以随机顺序返回结果." 有人可以澄清一下吗?
它^被称为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.