2015-11-09 14 views

cevap

11

Transdüserler gerçekten harmanlama işlevi için bir endişe olmamalı -, bu konuda herhangi bir dönüştürücüler tarafından dönüştürülmüş değerleri göreceksiniz in kanalda bir içe alan olarak Kanal ve out'da dinleyen tüm katılımcılar, bu kanalın dönüştürücüsü tarafından dönüştürülen değerleri görecektir. giriş kanalı kapattığında

, kapanış, out için tabi bunları bir uygulama gelince, aşağıda işlev in den max-count öğelerin toplu alacak veya son toplu çıkış beri ancak birçok max-time varmak ve çıkış giriş kanalının dönüştürücü (eğer varsa ve out dinleme herhangi girenlerin aynı zamanda, yukarıda belirtildiği gibi, kanalın dönüştürücü uygulanan olacaktır): basit ve doğru kodun, bir

(defn batch [in out max-time max-count] 
    (let [lim-1 (dec max-count)] 
    (async/go-loop [buf [] t (async/timeout max-time)] 
     (let [[v p] (async/alts! [in t])] 
     (cond 
      (= p t) 
      (do 
      (async/>! out buf) 
      (recur [] (async/timeout max-time))) 

      (nil? v) 
      (if (seq buf) 
      (async/>! out buf)) 

      (== (count buf) lim-1) 
      (do 
      (async/>! out (conj buf v)) 
      (recur [] (async/timeout max-time))) 

      :else 
      (recur (conj buf v) t)))))) 
+0

büyük parçası. Redis PubSub mesajlarını (yayıncı olarak 'out' kullanarak) toplulaştırmak için kullanılır. – siphiuel

+0

Harika bir cevap. – john

+0

"clojure.core.async/take" bunun için iyi bir uyum olup olmadığını merak ediyordum, ama temelde herhangi bir durumda döngüyü eklemek (ve "asla sonsuza dek engellememeli" zaman aşımı!) Gerekir. Günümüzde, yukarıdaki uygulama hala kaya gibi görünüyor. –

İlgili konular