2016-03-26 18 views

cevap

2

go-engelinin dönüş kanalını, go-engelinin tamamlanmasıyla senkronize etmek isteyen başka bir işleve (yalnızca makro değil) geçebileceğim bir tanıtıcı olarak kullanıyorum. Alternatif olarak, go-bloğunun tamamlanmasının tamamlanmasını garantilemek için kanaldaki okumaları bloke edebilirim. İşte

iki yönlü paralel yapılmasını yapar (değil toplamını hesaplamak için herhangi bir üretim kodu için kullanılması amaçlanan) basit bir örnek: Bu örnekte

(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))) 

, biz sol ve sağ toplamlar içinde hesaplamak paralel. Toplam toplamı hesaplamak için sol toplama ihtiyacımız olduğundan, sonuçta beklememiz ve go - engelini almamız gerekiyor.

+2

Bu yüzden bir go blok olduğu için, bir işlev için olabileceği gibi bir dönüş değeri diye bir şey yoktur. Bunu aşmak için bir go bloğu, dönüş değerini gönderdiği bir kanalı döndürür. –