2016-10-05 10 views

答えて

2

マッピングを適用し、その後、いくつかのコールバック関数を呼び出しますよう、機能でそれをラップすることができます:

user> (defn pmap-callback [callback f & colls] 
     (let [res (doall (apply pmap f colls))] 
      (callback res) 
      res)) 
#'user/pmap-callback 

user> (pmap-callback #(println "complete!" %) 
        + [1 2 3] [4 5 6]) 
;;=> complete! (5 7 9) 
(5 7 9) 
2

pmapドキュメンテーション文字列から:

マップと同様に、fが適用されることを除いて並行して。 並列計算が消費より先にとどまるが、 は必要でない限り全体の結果を実現しないという点で半怠惰である。 fの時間が の調整オーバーヘッドを支配する計算集約型関数の場合にのみ有効です。

したがって、結果シーケンスのすべての要素を尋ねるまで、pmap結果は完全には計算されません。他の遅延シーケンスと同様に、doall(評価されたシーケンスコンテンツ全体を保持する必要がある場合)またはdorunを使用して、遅延シーケンスを完全に実現させることができます(マッピング機能によって行われる副作用のみに興味があり、評価されたシーケンス)。

すべての結果が計算されたときに関数を実行するには、dorunまたはdoallの呼び出しの直後に関数を呼び出すことができます。

pmapは、処理が完了したときに通知を受け取ることができる非同期並列ジョブをスケジュールするためのツールではありません。そのような場合は、Clojure core.asyncの方が良いでしょう。

関連する問題