2016-03-26 11 views
1

「goブロック」(goまたはgo-loopか可能性がありますか他の構造体であろうと)がチャンネルを返します。しかし、私はこのチャンネルの目的を理解していない。私はそれを使用する方法を知りたいです。おそらく、私がする必要がないときに余分なチャンネルを作っているのかもしれません。core.async goブロックがチャネルを返すのはなぜですか?

答えて

2

goブロックの完了と同期したい別の関数(マクロだけではない)に渡すことができるハンドルとして、go -blockの戻りチャネルを使用します。あるいは、チャネルのブロック読み取りをプリフォームして、goブロックの実行が完了したことを保証することもできます。ここで

は、双方向の並列化を行う簡単な例(合計を計算するために、任意の生産コードのために使用されることを意味しない)である。この例では

(defn par-sum [coll] 
    (let [half-n (/ (count coll) 2) 
     [left right] (split-at half-n coll) 
     left-sum-chan (async/go (core/reduce + 0 left)) 
     right-sum (core/reduce + 0 right) 
     left-sum (async/<!! left-sum-chan)] 
    (+ left-sum right-sum))) 

、我々は左と右の合計を計算します平行。 全体の合計を計算するには左の合計が必要なので、結果を待ち、goブロックの結果を取得する必要があります。

+2

これはgoブロックなので、関数のような戻り値はありません。これを回避するためにgoブロックは戻り値を送るチャネルを返します。 –

関連する問題