Skip to content

Instantly share code, notes, and snippets.

@erikprice
Forked from michalmarczyk/producer_consumer.clj
Last active August 29, 2015 14:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save erikprice/2aa047fd06238f4c0b73 to your computer and use it in GitHub Desktop.
Save erikprice/2aa047fd06238f4c0b73 to your computer and use it in GitHub Desktop.
(use 'clojure.core.async)
(def output (atom []))
(defn producer [ctrl k]
(go (loop [i 0]
(when-let [c (<! ctrl)]
(>! c [k i])
(>! ctrl c)
(recur (inc i))))))
(defn consumer
([stop]
(consumer stop nil))
([stop buf-or-n]
(let [ctrl (chan 1)
c (chan buf-or-n)]
(>!! ctrl c)
(thread
(loop []
(let [[v p] (alts!! [stop c] :priority true)]
(if-not (identical? stop p)
(do (swap! output conj v)
(Thread/sleep 500) ; <- for the sake of the demo
(recur))
(close! ctrl)))))
ctrl)))
(defn start
([producers]
(start producers nil))
([producers buf-or-n]
(let [stop (chan 1)
ctrl (consumer stop buf-or-n)]
(dotimes [k producers]
(producer ctrl k))
(fn []
(>!! stop true)))))
(comment
(def stop (start 10))
(count @output)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment