【发布时间】:2011-11-25 16:17:30
【问题描述】:
我最近一直在试验 Clojure 的多线程功能,并尝试实现一个简单的并发问题。在下面的代码中,我使用一个代理运行函数 write 并尝试将作业发送到另一个代理,但程序在这一行阻塞:
(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
标签: concurrency clojure