gpt4 book ai didi

clojure - Clojure 中的线程安全文件写入

转载 作者:行者123 更新时间:2023-12-02 10:19:18 25 4
gpt4 key购买 nike

我正在尝试线程安全文件写入,但我不明白为什么此代码没有记录到文件(基于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com