Подтвердить что ты не робот

Выполнение кода с регулярными временными интервалами в Clojure

Какой лучший способ сделать код с регулярным интервалом в Clojure? В настоящее время я использую java.util.concurrent.ScheduledExecutorService, но эта Java - есть ли способ планирования кода Clojure для запуска через регулярные промежутки времени, после задержки, отмена? Все примеры кода Clojure, которые я видел, используют Thread/sleep, что также кажется слишком Java.

4b9b3361

Ответ 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)

Ответ 4

Библиотека "tools.timer" - это оболочка таймера Java: https://github.com/Ruiyun/tools.timer

Это очень легко использовать:

(use 'ruiyun.tools.timer)
(run-task! #(println "Say hello every 5 seconds.") :period 5000)