我正在寻找任何可以在给定时间触发事件的 clojure 方法,
例如:我希望一个特定的进程在上午 9:30 开始,然后我可以触发另一个进程在半小时后开始运行,等等。
提前致谢!
更新2:
感谢@arthur-ulfeoldt 和@unknown-person,他们还建议在删除他的答案之前使用https://github.com/samaaron/at-at 。文档有点过时,但这就是我的工作方式。
(使用'overtone.at-at) (def my-pool (mk-pool)) ;=> 创建一个线程池 (每 1000 次 #(println "I am supercool!") my-pool :initial-delay 2000) ;=> 在 2 秒延迟后每 1 秒启动一次打印功能 (停止*1) ;=> 停止它
所以要让它从 9 点开始,间隔半小时,我会这样做:
(需要'[clj-time.core :as t])
(需要'[clj-time.coerce :as c])
(使用'overtone.at-at)
;制作线程池
(def my-pool (mk-pool))
(定义当前时间(t/now))
(def 当前日期 (t/日期时间
(吨/年当前时间)
(吨/月当前时间)
(吨/天当前时间)))
(def next-9-oclock
(如果(> 9(吨/小时当前时间))
(t/plus current-date (t/hours 9))
(t/plus current-date (t/days 1) (t/hours 9))))
(定义初始延迟
(- (c/to-long next-9-oclock) (c/to-long current-time))
(每 180 万
#(println "我超酷!")
我的池
:初始延迟
初始延迟)
更新:
@arthur-ulfeoldt,我不知道如何将一些 java 代码翻译成 clojure。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html
像:
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
和:
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
整个例子
蜂鸣器控制类 {
私有最终 ScheduledExecutorService 调度程序 =
Executors.newScheduledThreadPool(1);
公共无效 beepForAnHour() {
最终 Runnable 蜂鸣器 = new Runnable() {
公共无效运行(){ System.out.println(“哔”);}
};
最终计划未来 beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
scheduler.schedule(new Runnable() {
公共无效运行(){beeperHandle.cancel(真);}
}, 60 * 60, 秒);
}
}