我正在寻找任何可以在给定时间触发事件的 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, 秒); } }