Ausführen von Code in regelmäßigen Abständen in Clojure

  • Wie kann Code in Clojure in regelmäßigen Abständen ausgeführt werden? Ich verwende derzeit java.util.concurrent.ScheduledExecutorService, aber das ist Java. Gibt es eine Clojure-Methode zum Planen von Code, um in regelmäßigen Abständen nach einer Verzögerung ablauffähig ausgeführt zu werden? Alle Clojure-Codebeispiele, die ich gesehen habe, verwenden Thread / sleep, was auch zu Java erscheint.

    22 November 2011
    Hendekagon
3 answers
  • Sehen Sie sich den Quellcode für Overtone an, insbesondere den Code zum Planen von Ereignissen zu einem bestimmten Zeitpunkt .

    Es ist ein Musiksynthesesystem, daher müssen Sie hoffen, dass der Timing-Code richtig ist!

    Außerdem haben sie den Timing-Code hilfreich in ein separates Projekt ( overtone / at-at ), sodass Sie es problemlos importieren können, wenn Sie möchten. Dies stellt einen schönen Clojure-Wrapper für die zugrunde liegenden Java-Bibliotheken bereit (z. B. ScheduledThreadPoolExecutor und Freunde). Die Syntax lautet wie folgt:

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

    Sie können Ereignisse auch zu bestimmten Zeiten planen:

     ;; run some-other-function 10 seconds from now
    (at (+ 10000 (now)) some-other-function)
     
    25 November 2011
    mikera
  • Von der Clojure-Website http://clojure.org/concurrent_programming :

    In allen Fällen ersetzt Clojure das Java-Thread-System nicht, sondern arbeitet mit ihm. Clojure-Funktionen sind java.util.concurrent.Callable, daher funktionieren sie mit dem Executor-Framework usw.

    Es klingt so, als würden Sie es bereits richtig machen Weg.

     (import 'java.util.concurrent.Executors)
    (import 'java.util.concurrent.TimeUnit) 
    (.scheduleAtFixedRate (Executors/newScheduledThreadPool 1) 
      #(println "Hello") 0 5 TimeUnit/SECONDS)
     
    22 November 2011
    nickmbailey
  • Die Bibliothek "tools.timer" ist ein Java-Timer-Wrapper: https: // github. de / Ruiyun / tools.timer

    Die Verwendung ist sehr einfach:

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