2010-12-30 7 views

Respuesta

14

Puede iniciar un hilo con una función que se ejecuta para siempre.

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

(.start (Thread. forever)) 

Si no desea que el subproceso de fondo para bloquear el proceso de salida, asegúrese de que sea un hilo de utilidad:

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

Si quieres un poco más delicadeza se puede utilizar el java.util .concurrent.Executors factory para crear un ExecutorService. Esto facilita la creación de grupos de hilos, el uso de fábricas de hilos personalizadas, colas de entrada personalizadas, etc.

La claypoole lib engloba parte de la ejecución del trabajo en una API apta para clojure si eso es lo que está pescando hacia.

5

Mi sencilla de orden superior función de bucle infinito (usando futuros):

(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 

I recomienda utilizar un átomo o una de Clojures otros tipos de referencia para almacenar los resultados (como por el contador en el ejemplo anterior)

Con un poco de ajuste también podría utilizar este enfoque para iniciar/detener/pausar el proceso de una manera segura (por ejemplo, probar una bandera para ver si (función) debería ejecutarse en cada iteración del ciclo) .

+2

p.s. también es bueno saber que la sobrecarga de este enfoque es bastante mínima: puede obtener más de un millón de incrementos de contador por segundo si elimina el hilo/dormir – mikera

+0

Otra implementación simple que no consumirá la pila '(defn infinite [f segundos] (future [loop]] (f) (Thread/sleep (* seconds 1000)) (recur)))) ' –

+0

@James - mi implementación tampoco consume pila. El hecho de que la llamada recursiva a 'infinite-loop' esté dentro de un futuro significa que no se repite dentro del marco de la pila de la función original. – mikera

Cuestiones relacionadas