最近我一直在试验Clojure的多线程特性,并试图实现一个简单的并发问题。在下面的代码我运行函数写一个代理,并尝试将作业发送到另一个代理,但在这行的程序块:Clojure代理可以调用另一个代理吗?
(doseq [j (range (count readers))]
(send (nth readers j) rr (inc j)))
完整代码:
(def state (ref 0))
(def readers (doall (map #(agent %) (repeat 3 0))))
(def writers (doall (map #(agent %) (repeat 3 0))))
(defn rr [re]
(println (format "Read about %s" @state))
(inc re)
)
(defn write [re topic]
(dosync
(ref-set state topic)
)
(Thread/sleep (rand-int 1000))
(println "Wrote about" topic)
(doseq [j (range (count readers))]
(send (nth readers j) rr (inc j)))
(inc re)
)
(defn -main[]
(dotimes [i 5]
(doseq [j (range (count writers))]
(send (nth writers j) write (inc j))))
(dorun (map #(await %) writers))
(dorun (map #(println "Writes:" @%) writers))
)
只是一个方面的评论,它不是特别习惯的lisp把封闭的parens放入换行符 – skuro