我有一组来自队列的 future 处理作业,涉及写入文件。确保一次只有一个未来访问特定文件的惯用方法是什么?
使用代理而不是锁来确保这一点怎么样?
我认为使用代理来保护共享的可变状态,无论它是在内存中还是在磁盘上,在 clojure 中比使用锁更惯用。
如果您一次创建一个代理并将访问尝试发送给代理,则可以确保一次只有一个线程访问给定文件。
例如这样:
(use 'clojure.contrib.duck-streams)
(defn file-agent [file-name]
(add-watch (agent nil) :file-writer
(fn [key agent old new]
(append-spit file-name new))))
(defn async-append [file-agent content]
(send file-agent (constantly content)))
然后通过代理附加您的文件:
(async-append "content written to file" (file-agent "temp-file-name"))
如果您需要同步使用文件,可以使用await 来实现。像这样:
(defn sync-append [file-agent content]
(await (send file-agent (constantly content))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)