我有一种情况,我观察一个特定目录以进行文件系统更改。如果该目录中的某个文件被更改,我会重新读取它,附加一些现有的缓存信息,并将其存储在atom
.
相关代码看起来像
(def posts (atom []))
(defn load-posts! []
(swap!
posts
(fn [old]
(vec
(map #(let [raw (json/parse-string % (fn [k] (keyword (.toLowerCase k))))]
(<snip some processing of raw, including getting some pieces from old>))
(line-seq (io/reader "watched.json")))))))
;; elsewhere, inside of -main
(watch/start-watch
[{:path "resources/"
:event-types [:modify]
:callback (fn [event filename]
(when (and (= :modify event) (= "watched.json" filename))
(println "Reloading posts.json ...")
(posts/load-posts!)))}
...])
这最终在本地工作正常,但是当我将它部署到我的服务器时,swap!
呼叫挂了大约一半。
我试过通过 调试它println
,它告诉我
- 正在触发文件系统触发器。
swap!
没有多次运行该功能- 正在打开并解析被监视的文件
- 文件中的一些条目正在处理中,但该处理在条目处停止
111
(这似乎与之前的任何条目没有显着不同)。 - 更新未完成,
atom
因此保留旧值 - 挂起后不会触发任何文件系统事件。
我怀疑这可能是某个地方的内存问题,或者可能是Clojure-Watch(或底层 FS-watching 库)中的错误。
有什么想法可以解决它或进一步诊断它吗?