在clojure中锁定惯用文件?

jhi*_*ner 7 clojure

我有一组来自队列的期货处理工作,涉及写入文件.什么是确保只有一个未来一次访问特定文件的惯用方法是什么?

Ver*_*erg 8

如何使用代理而不是锁来确保这一点?

我认为使用代理可以安全地保护共享的可变状态,无论它在内存中还是在磁盘上,在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)))
Run Code Online (Sandbox Code Playgroud)

然后通过代理附加您的文件:

(async-append "content written to file" (file-agent "temp-file-name"))
Run Code Online (Sandbox Code Playgroud)

如果您需要同步使用该文件,可以通过等待来实现.像这样:

(defn sync-append [file-agent content]
  (await (send file-agent (constantly content))))
Run Code Online (Sandbox Code Playgroud)