↖️ Show all posts

Clojures core.async Hot Diggity Dogs

read Clojure for the Brave and True - Chapter about “core.async” with detailed behind the scenes content, or …

fire up a repl and experiment with the given Clojure code pieces yourself - but then read the article!

(ns example.core
  (:require [clojure.core.async
             :as a
             :refer [>! <! >!! <!! go chan buffer close! thread
                     alts! alts!! timeout]]))

;; simple example with sleep between channel reads
;; opens a channel
;; send 3 types of ketchup to channel
;; reads 3 times from channel
(do (def echo-chan (chan))
    (go (println (<! echo-chan)))
    (go (>! echo-chan "ketchup!"))
    (go (>! echo-chan "ketchup!!"))
    (go (>! echo-chan "ketchup!!!"))
    (Thread/sleep 1000)
    (go (println (<! echo-chan)))
    (Thread/sleep 2000)
    (println (<!! echo-chan)))

;; closed channels allow main process to proceed and not block, waiting
(let [c (chan 2)]
  (>!! c 1)
  (>!! c 2)
  (close! c)
  (println (<!! c)) ; 1
  (println (<!! c)) ; 2
  ;; since we closed the channel this will return false,
  ;; we can no longer add values
  (>!! c 1) ; false
  (<!! c) ; nil
  (<!! c) ; nil
  )

;; example of a non-blocking hot-dog-machine
;; each step is followed by some preparation time
(defn hot-dog-machine
  []
  (let [in (chan)
        out (chan)]
    (go (prn (str (<! in) " was thrown in"))
        (prn (str "processing: '" (<! in) "'"))
        (Thread/sleep 2000)
        (prn (str "preparing hot dog ..."))
        (Thread/sleep 2000)
        (prn (str "handing out string: 'hot dog'"))
        (>! out "hot dog"))
    [in out]))

;; sleep between paying and ordering ketchup
(defn make-hot-dog
  [money]
  (let [[in out] (hot-dog-machine)]
    (>!! in money)
    (Thread/sleep 2000)
    (>!! in "ketchup, please!")
    (<!! out)))

(go (prn (str "pocket lint: " (make-hot-dog "pocket lint"))))
(prn (str "result is: " (+ 1 2 3)))
(Thread/sleep 1000)
(prn (str "i received a " (make-hot-dog "big moneys") " for my big moneys"))

⬅️ Read previous Read next ➡️