Выполнение кода с регулярными интервалами времени в Clojure
каков наилучший способ заставить код работать с регулярными интервалами в Clojure ? В настоящее время я использую java.утиль.параллельный.Scheduledexecutorservice выполняет, но вот на Java - есть в Clojure способ планирования код для запуска на регулярной основе, после задержки, cancellably ? Все примеры кода Clojure, которые я видел, используют Thread / sleep, который также кажется слишком Java.
4 ответов
хорошо стоит посмотреть исходный код для призвук, в частности код для планирования событий в определенное время.
это система синтеза музыки, поэтому вы должны надеяться, что у них есть правильный код синхронизации!!
также они услужливо разделили код синхронизации на отдельный проект (обертон / 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)
С веб-сайта clojure http://clojure.org/concurrent_programming:
во всех случаях Clojure не заменяет систему потоков Java, а работает с ней. Функции Clojure-это java.утиль.параллельный.Вызывается, поэтому они работают с платформой Executor и т. д.
похоже, вы уже делаете это правильно.
(import 'java.util.concurrent.Executors)
(import 'java.util.concurrent.TimeUnit)
(.scheduleAtFixedRate (Executors/newScheduledThreadPool 1)
#(println "Hello") 0 5 TimeUnit/SECONDS)
Я сам ответил на свой вопрос @ реализация планировщика типа cron в clojure
может быть cronj может помочь?
"инструменты.библиотека "timer" - это оболочка таймера Java:https://github.com/Ruiyun/tools.timer
Он очень прост в использовании:
(use 'ruiyun.tools.timer)
(run-task! #(println "Say hello every 5 seconds.") :period 5000)