Как создать постоянный фоновый процесс в Clojure?
Как создать постоянный фоновый процесс в Clojure? Использует "будущее" с циклом, который никогда не заканчивается правильным образом?
Ответы
Ответ 1
Вы можете просто запустить Thread с функцией, которая работает вечно.
(defn forever []
;; do stuff in a loop forever
)
(.start (Thread. forever))
Если вы не хотите, чтобы фоновый поток блокировал выход из процесса, не забудьте сделать его потоком демона:
(doto
(Thread. forever)
(.setDaemon true)
(.start))
Если вы хотите еще немного утонченности, вы можете использовать java.util.concurrent.Executors factory для создания ExecutorService. Это упрощает создание пулов потоков, использование пользовательских фабрик потоков, пользовательских входящих очередей и т.д.
claypoole lib обертывает некоторые элементы выполнения работы в более clojure -другой api, если это то, кружиться.
Ответ 2
Моя простая функция бесконечного цикла более высокого порядка (с использованием фьючерсов):
(def counter (atom 1))
(defn infinite-loop [function]
(function)
(future (infinite-loop function))
nil)
;; note the nil above is necessary to avoid overflowing the stack with futures...
(infinite-loop
#(do
(Thread/sleep 1000)
(swap! counter inc)))
;; wait half a minute....
@counter
=> 31
Я настоятельно рекомендую использовать атом или один из других ссылочных типов Clojures для хранения результатов (согласно счетчику в примере выше).
С небольшим количеством настроек вы также можете использовать этот подход для запуска/остановки/приостановки процесса поточно-безопасным способом (например, проверить флаг, чтобы увидеть, должна ли (функция) выполняться на каждой итерации цикла).
Ответ 3
Может быть, или, может быть, Лейн-демон? https://github.com/arohner/lein-daemon