Выполнение кода через регулярные промежутки времени в Clojure - PullRequest
17 голосов
/ 22 ноября 2011

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

Ответы [ 4 ]

21 голосов
/ 22 ноября 2011

Стоит обратить внимание на исходный код 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)
16 голосов
/ 22 ноября 2011

С веб-сайта 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)
1 голос
/ 28 июля 2012

Я ответил на свой вопрос @ Реализация планировщика типа cron в clojure

может быть cronj может помочь?

0 голосов
/ 26 декабря 2014

Библиотека "tools.timer" является оберткой Java Timer: https://github.com/Ruiyun/tools.timer

Очень прост в использовании:

(use 'ruiyun.tools.timer)
(run-task! #(println "Say hello every 5 seconds.") :period 5000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...