There is a broadcast fn in the lab namespace (https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async/lab.clj) that does this and I believe David Nolen has created a different variant in some of his stuff. The lab one is experimental and would welcome feedback on it.
Alex On Tuesday, July 9, 2013 6:46:21 PM UTC-5, Thomas Heller wrote: > > Hey, > > I'm doing some core.async tests and want to create a basic pub/sub model. > Messages are >! on one channel and >! to many others. > > (deftest ^:wip async-test2 > > (let [subscribers (atom []) > events (chan 100)] > > (go (loop [] > (when-let [ev (<! events)] > (doseq [c @subscribers] > (alt! > [[c ev]] :sent > :default nil ;; could "force" unsubscribe c? > )) > (recur)))) > > (let [s1 (chan 1) > s2 (chan 100) > r1 (atom []) > r2 (atom [])] > (swap! subscribers conj s1 s2) > ;; simulated slow reader > (go (loop [] > (when-let [ev (<! s1)] > (swap! r1 conj ev) > (<! (timeout 10)) > (recur)))) > ;; good reader > (go (loop [] > (when-let [ev (<! s2)] > (swap! r2 conj ev) > (recur)))) > (<!! (go (loop [i 0] > (when (< i 100) > (>! events i) > (recur (inc i)))))) > > (close! events) > (Thread/sleep 25) > (pprint @r1) > (pprint @r2)) > )) > > > In this example the s1 subscriber will loose almost all messages since he > cannot keep up (and buffer is too small). I choose to alt!/:default to drop > messages, since I don't want any subscriber to block others. How do you > guys deal with slow-readers? > > I don't really have a specific problem but I wonder if there are any plans > for some built-in pub/sub mechanisms for core.async. Seems like a very > common pattern. > > Anyways, core.async is nice! > > Cheers, > /thomas > > > -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.