首页 > 解决方案 > 使用 Clojure 安排每天午夜调用函数的最简单方法是什么?

问题描述

虽然可以使用线程并设置超时以从新线程启动时以设定的时间间隔运行函数,但如何使函数从下一个午夜开始在 00:00:00 运行?

标签: multithreadingclojure

解决方案


你也可以看看chime library。

我没有测试这段代码,而是这样的。

(ns my.example
  (:require [chime :refer [chime-at]])
  (:import  [java.time Instant LocalTime ZonedDateTime ZoneId Period]))

(defn my-task []
  (println "Executing a task"))

(defn periodic-seq [^Instant start duration-or-period]
  (iterate #(.addTo duration-or-period %) start)) ;; produces a lazy-seq of Instants

;; generates infinite sequence of days. Change the time zone to the one you need. 
(def days 
  (periodic-seq (-> (LocalTime/of 23 0 0) 
                    (.adjustInto (ZonedDateTime/now (ZoneId/of "America/New_York")))
                    .toInstant)
                (Period/ofDays 1)))

(chime-at days (fn [time] (my-task)))        

chime-at 返回一个零参数函数,您可以调用它来取消计划。所以你需要像这样开始计划。

(def cancel (chime-at days (fn [time] my-task)))
(cancel) 

同样,我还没有测试过这段代码。


推荐阅读