Hello,

I had a problem when I run the following code:

(defn get-task [tasks]
  (dosync
    (let [task (first @tasks)]
      (alter tasks rest)
      task)))

(defn worker [& {:keys [tasks]}]
  (agent {:tasks tasks}))

(defn worker-loop [{:keys [tasks] :as state}]
  (loop [last-task nil]
    (if-let [task (get-task tasks)]
      (recur task)
      (locking :out (println "Last task: " last-task))))
  state)

(defn create-workers [count & options]
  (->> (range 0 count)
       (map (fn [_] (apply worker options)))
       (into [])))

(defn start-workers [workers]
  (doseq [worker workers] (send-off worker worker-loop)))

(def tasks (ref (range 1 10000000)))

(def workers (create-workers 100 :tasks tasks))

(start-workers workers)
(apply await workers)

Description: I have several agents (100 in my case). Each agent running in 
a separate thread. All agents share the one ref with the collection of 
tasks (range of longs in my case). Each agent get tasks from the collection 
(in transaction) one by one until the collection becomes empty and then 
prints the last task which it handle. However, when I run this code it 
looks like the collection of tasks suddenly becomes empty and workers 
handle only portion of all tasks (average 25-40% of all number).

This code behave as I expected, when I create only one agent or use 
explicit locking in get-task function:

(defn get-task [tasks]
  (locking :lock
    (dosync
    (let [task (first @tasks)]
      (alter tasks rest)
      task))))

I run this code on the Clojure 1.8.0
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

Can anyone tell me, what am I doing wrong, or it really looks like a bug in 
the clojure STM?
I already asked this question on stackoverflow.com (
http://stackoverflow.com/questions/39054911/strange-behavior-of-clojure-ref), 
but so far nobody has been able to help me.

P.S. Sorry for my english skill.

-- 
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/d/optout.

Reply via email to