我有两个文件,都是 1 字节大(仅包含“1”或“0”)。
现在在用 Clojure 编写的程序的主循环中,我想等到其中一个文件发生更改后再继续。这可以通过忙碌等待来完成,使用 slurp 轮询文件以进行更改。但这是对资源的浪费。
我怎么能不忙着等待呢?
我有两个文件,都是 1 字节大(仅包含“1”或“0”)。
现在在用 Clojure 编写的程序的主循环中,我想等到其中一个文件发生更改后再继续。这可以通过忙碌等待来完成,使用 slurp 轮询文件以进行更改。但这是对资源的浪费。
我怎么能不忙着等待呢?
在 Java VM>7 上,我会说您可以使用 Watch Service API。您可以直接使用它,也可以使用现有的 Clojure 包装器之一,因为它们非常丰富。
使用 Clojure-Watch,它看起来是这样的:
(ns clojure-watch.example
(:require [clojure-watch.core :refer [start-watch]]))
(start-watch [{:path "/home/niko/project/hello"
:event-types [:create :modify :delete]
:bootstrap (fn [path] (println "Starting to watch " path))
:callback (fn [event filename] (println event filename))
:options {:recursive true}}])
```
您可以收听文件的修改、删除和创建。Watch API 尽可能使用本机文件系统支持文件更改通知。
为了完成 Nicolas 的回答,还有 https://github.com/wkf/hawk在 MacOS 上似乎更有效地工作。