multithreading - 使用 Clojure 安排每天午夜调用函数的最简单方法是什么?
问题描述
虽然可以使用线程并设置超时以从新线程启动时以设定的时间间隔运行函数,但如何使函数从下一个午夜开始在 00:00:00 运行?
解决方案
你也可以看看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)
同样,我还没有测试过这段代码。
推荐阅读
- reactjs - 状态触发时的 useEffect 清理
- javascript - Discord 机器人发布多个结果
- bash - 如何使用 AWK 和 ffmpeg 提取时间码
- javascript - 如何再次调用javascript中的函数?
- javascript - 按顺序进行异步调用并在错误时重复
- r - 根据 R 中的列值字符串将数据帧拆分为两个子数据帧
- python-3.x - 如何获取运算符类型并将公式应用于熊猫数据框
- c# - 如何将对象变量发送到由 BackgroundWorker 实例调用 dowork 的方法中?
- c++ - Msys2 mingw 用 openssl 构建 libcurl,但不支持 https
- arrays - 程序给出分段错误