作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试线程安全文件写入,但我不明白为什么此代码没有记录到文件(基于 http://blakesmith.me/2012/05/25/understanding-clojure-concurrency-part-2.html 的代理部分)
代码运行了所有正确的函数,但文件仍然是空的。我认为这是因为文件关闭没有以某种方式发生,但即使取消引用 future 以强制关闭最后作为测试似乎也没有帮助。
(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)))
小问题:链接的帖子从未真正解释为什么我需要在写出结束时返回文件编写器指针。我知道你需要它,但我不知道为什么。
最佳答案
也许您需要调用(.flush out)
?
您的函数需要返回 out
,以便代理在接收到的下一个 defn
调用时具有该值。写入文件本身就是一个副作用。
代理
的典型示例用例是由多个线程“递增”(好吧,替换为新的递增值)的计数器。但是,在这种情况下,您不会递增计数器,而是写入 out
(OutputStream
实例)。因此必须返回out
,以便将其传递给下一个代理任务。
我发现有用的博客文章: http://lethain.com/a-couple-of-clojure-agent-examples/
关于clojure - Clojure 中的线程安全文件写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16065383/
我是一名优秀的程序员,十分优秀!