As you can read here: 
http://martintrojer.github.io/clojure/2013/07/07/coreasync-and-blocking-io 
doing blocking IO in a go block should be avoided. So I was thinking that 
an alternative to non-blocking IO APIs is using agents and channels.

The following sample program intends to illustrate the technique:

(require '[clojure.core.async :as async :refer :all])
(import '[java.util.concurrent Executors])

(spit "bar" (apply str (shuffle (range 100))))

(def slurper (agent nil))

(def spitter (agent nil))

(def max-concurrency 1)

;; when a go block wants to slurp a file, it communicates it by writing to 
thins channel
(def slurping-request (chan max-concurrency))

;; where requested slurped content gets served
(def slurps (chan max-concurrency))

(def rw-pool (Executors/newFixedThreadPool max-concurrency))

(def serving
  (future
    (while (<!! slurping-request)
      (send-via rw-pool slurper (fn [_] (>!! slurps (seq (slurp "bar"))) 
_)))))

(go (while true
      (>! slurping-request :req)
      (let [old (<! slurps)
            new (apply str (shuffle old))]
        (send-via rw-pool spitter (fn [_] (spit "bar" new))))))

It is supposed to constantly modify a file, until you (close! 
slurping-request). However, somehow nil-related issues crept in:


   - With max-concurrency set to 1, at times an empty string gets written 
   to the file.
   - With max-concurrency set to 4, the spitter agent fails.


What is going on? Maybe files need locking? Or am I misunderstanding some 
aspect of core.async itself?

-- 
-- 
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.


Reply via email to