Как я могу создать постоянно работающий фоновый процесс в Clojure? - PullRequest
13 голосов
/ 30 декабря 2010

Как я могу создать постоянно работающий фоновый процесс в Clojure?Используете ли вы «будущее» с циклом, который никогда не заканчивается правильным путем?

Ответы [ 3 ]

15 голосов
/ 30 декабря 2010

Вы можете просто запустить поток с функцией, которая работает вечно.

(defn forever []
  ;; do stuff in a loop forever
)

(.start (Thread. forever))

Если вы не хотите, чтобы фоновый поток блокировал выход процесса, обязательно сделайте его потоком демона:

(doto 
   (Thread. forever)
   (.setDaemon true)
   (.start))

Если вам нужно больше утонченности, вы можете использовать фабрику java.util.concurrent.Executors для создания ExecutorService. Это упрощает создание пулов потоков, использование пользовательских потоковых фабрик, пользовательских входящих очередей и т. Д.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

5 голосов
/ 30 декабря 2010

Моя простая функция бесконечного цикла высшего порядка (с использованием фьючерсов):

(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 для хранения результатов (согласно счетчику в приведенном выше примере).

Немного подправив, вы также можете использовать этот подход, чтобы запустить / остановить / приостановить процесс потокобезопасным способом (например, проверить флаг, чтобы увидеть, должна ли (функция) выполняться в каждой итерации цикла).

1 голос
/ 30 декабря 2010

Может быть, или, возможно, Лейн-демон?https://github.com/arohner/lein-daemon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...