私はスレッドセーフなファイル書き込みで遊んでいますが、このコードがファイルにログを記録しない理由がわかりません (次のエージェントセクションに基づく: http://blakesmith.me/2012/05/25/understanding -clojure-concurrency-part-2.html )
コードはすべての適切な関数にヒットしていますが、ファイルは空のままです。ファイルのクローズが何らかの形で発生していないためだと思いますが、テストとしてクローズを最後に強制するために先物を逆参照しても効果がないようです。
(defn write-out [out msg]
(.write out msg)
out)
(defn log [logger msg]
(send logger write-out msg))
(defn close [logger]
(send logger #(.close %)))
(defn go []
(let [ofile (agent (clojure.java.io/writer "/tmp/log.test.txt" :append true))]
(dotimes [x 10]
(future (log ofile (str "Log A " x "\n"))))
(close ofile)
(shutdown-agents)))
ちょっとしたおまけの質問: リンクされた投稿では、書き出しの最後にファイル ライター ポインターを返す必要がある理由がまったく説明されていません。あなたがそれを必要としていることは知っていますが、その理由はわかりません。