У меня есть situation, где я просматриваю конкретный каталог для изменения файловой системы. Если какой-либо файл в этом каталоге изменен, я перечитаю его, прикрепите некоторую существующую кешированную информацию и сохраните ее в atom
.Обновление Atom зависает во время вызова вызова Clojure
Соответствующий код выглядит
(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).
Любые идеи, как я могу это исправить или диагностировать дальше?
Похоже, что во время обработки происходит проглатывание. Поверните встроенную функцию, отображаемую в строке-seq, в отдельные отдельные функции и проверьте их на соответствующей записи. –
... или попробуйте/поймайте вызов «load-posts!» И посмотрите, что его выбрасывает. – Alex