clojure timing

Ejecución de código a intervalos regulares en Clojure



timing (4)

¿Cuál es la mejor manera de hacer que el código se ejecute a intervalos regulares en Clojure? Actualmente estoy usando java.util.concurrent.ScheduledExecutorService, pero eso es Java. ¿Hay alguna forma de código de programación de Clojure para ejecutar a intervalos regulares, después de un retraso, cancelable? Todos los ejemplos de código de Clojure que he visto utilizan Thread / sleep, que también parece demasiado Java.


Desde el sitio web de clojure http://clojure.org/concurrent_programming :

En todos los casos, Clojure no reemplaza el sistema de subprocesos de Java, sino que funciona con él. Las funciones de Clojure son java.util.concurrent.Callable, por lo tanto, funcionan con el marco del Ejecutor, etc.

Parece que ya lo estás haciendo de la manera correcta.

(import ''java.util.concurrent.Executors) (import ''java.util.concurrent.TimeUnit) (.scheduleAtFixedRate (Executors/newScheduledThreadPool 1) #(println "Hello") 0 5 TimeUnit/SECONDS)


La biblioteca "tools.timer" es un contenedor de Java Timer: https://github.com/Ruiyun/tools.timer

Es muy fácil de usar:

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



Vale la pena mirar el código fuente de Overtone , en particular el código para programar eventos en un momento determinado .

Es un sistema de síntesis musical, ¡así que debes esperar que tengan el código de sincronización correcto!

También han separado el código de tiempo en un proyecto separado ( overtone/at-at ) para que pueda importarlo fácilmente si lo desea. Esto proporciona un bonito envoltorio de Clojure a las bibliotecas de Java subyacentes (es decir, ScheduledThreadPoolExecutor y amigos). La sintaxis es así:

;; run some-function every 500ms (every 500 some-function)

También puedes programar eventos en momentos específicos:

;; run some-other-function 10 seconds from now (at (+ 10000 (now)) some-other-function)