【问题标题】:Elixir's parallel map algorithmElixir 的并行映射算法
【发布时间】:2016-06-27 18:49:49
【问题描述】:

我目前正在阅读“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

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

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

    receive do
      {pid, result} -> result
    end
    

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

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

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

    【讨论】:

    • 我知道这是在文档中,做了我的功课,但真的无法掌握这个概念。问题已解决,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多