最近我一直在試驗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