Advertisement
Guest User

Untitled

a guest
Aug 17th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (def N 2)
  2. (def counter (atom 0))
  3.  
  4. (defn rate-limit-exceeded? []
  5.   (>= @counter N))
  6.  
  7. (def balancer (agent {}))
  8.  
  9. (def queue (atom clojure.lang.PersistentQueue/EMPTY))
  10.  
  11. (defn enqueue! [value]
  12.   (swap! queue conj value)
  13.   nil)
  14.  
  15. (defn dequeue! []
  16.   (let [[old new] (swap-vals! queue pop)]
  17.     (peek old)))
  18.  
  19. (defn request [_]
  20.   (when-not (rate-limit-exceeded?)
  21.     (swap! counter inc)
  22.     (when-let [item (dequeue!)]
  23.       (let [word (:word item)]
  24.         (println "request" word "...")
  25.         (future
  26.           (Thread/sleep (+ (rand-int 1000) 1000))
  27.           (when-not (realized? (:promise item))
  28.             (deliver (:promise item) {word (str "http://google.com?q=" word)}))
  29.           (swap! counter dec))))))
  30.  
  31. (defn counter-watcher [key atom old-state new-state]
  32.   (send-off balancer request))
  33.  
  34. (add-watch counter :watcher counter-watcher)
  35.  
  36. (defn get-url [word]
  37.   (let [response (promise)
  38.         item {:word word :promise response}]
  39.     (enqueue! item)
  40.     (send-off balancer request)
  41.     response))
  42.  
  43. (def fixtures [
  44.                "ocaml haskell erlang"
  45.                "clojure racket scheme"
  46.                "ruby python php"
  47.                ])
  48.  
  49. (defn get-urls [words]
  50.   (apply merge (pmap (fn [word] @(get-url word)) words)))
  51.  
  52. (defn endpoint []
  53.   (println (pmap #(get-urls (clojure.string/split % #" ")) fixtures)))
  54.  
  55. (endpoint)
  56. (shutdown-agents)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement