(require '[clojure.core.async :as async :refer :all]) | |
(defn fake-search [kind] | |
(fn [query] | |
(Thread/sleep (int (* (java.lang.Math/random) 1000))) | |
(str kind " result for " query))) | |
(def web (fake-search "Web")) | |
(def image (fake-search "Image")) | |
(def video (fake-search "Video")) | |
;; Google search 2.0 | |
;; http://talks.golang.org/2012/concurrency.slide#46 | |
(defn google2-0 [query] | |
(let [c (chan)] | |
(go (>! c (web query))) | |
(go (>! c (image query))) | |
(go (>! c (video query))) | |
(reduce (fn [results _] | |
(conj results (<!! (go (<! c))))) | |
[] | |
(range 3)))) | |
(google2-0 "Clojure") | |
;; Google search 2.1 | |
;; http://talks.golang.org/2012/concurrency.slide#47 | |
(defn google2-1 [query] | |
(let [c (chan) | |
t (timeout 500)] | |
(go (>! c (web query))) | |
(go (>! c (image query))) | |
(go (>! c (video query))) | |
(reduce (fn [results _] | |
(conj results (first (alts!! [c t])))) | |
[] | |
(range 3)))) | |
(google2-1 "Clojure") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment