如何使用代理而不是锁来确保这一点?
我认为使用代理可以安全地保护共享的可变状态,无论它在内存中还是在磁盘上,在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)
| 归档时间: |
|
| 查看次数: |
1675 次 |
| 最近记录: |