2016-06-27 2 views
1

私は現在、「プログラミングエリクシール」本を働いて、そしてちょうど並行的に実施し、「マップ」のこの例を見つけています:エリクサーの並列マップアルゴリズム

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の結果を順番に取得します。これがなければ、結果はランダムな順序で返されます。 "誰かがこれを明確にすることはできますか?

答えて

3

^は、ピン演算子と呼ばれます。新しい値に再バインドするのではなく、変数の前の値と一致します。そう:

receive do 
    {pid, result} -> result 
end 

フォーム{whatever, whatever}の任意のメッセージを受信し、そのタプルから2番目の要素を返します。しかし

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

タプルだと最初の要素がpidに保存されているいくつかの正確な値である任意のメッセージを受信します。

+0

私はこれがドキュメントにあったことを知っていますが、私の宿題をしましたが、本当にその概念を理解することはできませんでした。問題は解決しました、ありがとう! – sixFingers

関連する問題