Выполнение кода с регулярными интервалами времени в 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)