Какой лучший способ сделать код с регулярным интервалом в Clojure? В настоящее время я использую java.util.concurrent.ScheduledExecutorService, но эта Java - есть ли способ планирования кода Clojure для запуска через регулярные промежутки времени, после задержки, отмена? Все примеры кода Clojure, которые я видел, используют Thread/sleep, что также кажется слишком Java.
Выполнение кода с регулярными временными интервалами в Clojure
Ответ 1
Хорошо стоит посмотреть на исходный код Overtone, в частности для планирования событий в определенное время.
Это система синтеза музыки, поэтому вам нужно надеяться, что у них есть правильный код времени!
Кроме того, они помогают разделить код времени на отдельный проект (overtone/at-at), чтобы вы могли легко импортировать его, если хотите, Это обеспечивает приятную оболочку Clojure для базовых библиотек Java (т.е. ScheduledThreadPoolExecutor и друзей). Синтаксис выглядит следующим образом:
;; run some-function every 500ms
(every 500 some-function)
Вы также можете рассылать события в определенное время:
;; run some-other-function 10 seconds from now
(at (+ 10000 (now)) some-other-function)
Ответ 2
На веб-сайте clojure http://clojure.org/concurrent_programming:
Во всех случаях clojure не заменяет систему потоков Java, а работает с ней. clojure функции java.util.concurrent.Callable, поэтому они работают с инфраструктурой Executor и т.д.
Похоже, вы уже делаете это правильно.
(import 'java.util.concurrent.Executors)
(import 'java.util.concurrent.TimeUnit)
(.scheduleAtFixedRate (Executors/newScheduledThreadPool 1)
#(println "Hello") 0 5 TimeUnit/SECONDS)
Ответ 3
Я ответил на свой вопрос @Внедрение планировщика типа cron в clojure
возможно cronj может помочь?
Ответ 4
Библиотека "tools.timer" - это оболочка таймера Java: https://github.com/Ruiyun/tools.timer
Это очень легко использовать:
(use 'ruiyun.tools.timer)
(run-task! #(println "Say hello every 5 seconds.") :period 5000)