¿Cómo puedo crear un proceso de fondo constantemente en ejecución en Clojure? ¿Está usando "futuro" con un ciclo que nunca termina de la manera correcta?¿Cómo puedo crear un proceso de fondo constantemente en ejecución en Clojure?
Respuesta
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.
Tal vez, o tal vez Lein-daemon? https://github.com/arohner/lein-daemon
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) .
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
Otra implementación simple que no consumirá la pila '(defn infinite [f segundos] (future [loop]] (f) (Thread/sleep (* seconds 1000)) (recur)))) ' –
@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
- 1. Clojure: Cómo crear una función en tiempo de ejecución
- 2. ¿Cómo puedo crear controles WPF en un hilo de fondo?
- 3. Clojure constantemente mapa funcional y
- 4. ¿Cómo conecto un archivo fuente de clojure a un clojure repl en ejecución en Emacs?
- 5. cómo puedo crear un vector grande en clojure
- 6. engendrar un proceso de fondo en Ruby
- 7. Proceso de fondo en Linux
- 8. ¿Cómo obtener un buen funcionamiento de un proceso en ejecución?
- 9. ¿Cómo puedo crear el fondo del proceso R en ESS/Emacs?
- 10. ¿Matar un proceso en ejecución en ColdFusion?
- 11. ¿Puedo usar GDB para depurar un proceso en ejecución?
- 12. ¿Cómo puedo poner un proceso en segundo plano después de su ejecución con CTRL + Z roto?
- 13. Cómo crear un proceso en Java
- 14. Python REPL para un proceso en ejecución
- 15. Cómo rotar CONSTANTEMENTE un objeto con jquery?
- 16. .NET4: Explicación de ejecución en proceso en proceso
- 17. Cómo abrir archivos abiertos/usados de un proceso en ejecución
- 18. Crear un proceso de asistente en backbone.js
- 19. Cancelar un proceso de compilación en ejecución en VS
- 20. ¿Cómo puedo adjuntar un depurador a un proceso Perl en ejecución?
- 21. Proceso de ejecución dado el proceso handle
- 22. linux: ¿obteniendo umask de un proceso ya en ejecución?
- 23. Django: iniciar un proceso en un hilo de fondo?
- 24. ¿Cómo puedo actualizar un elemento en un vector en Clojure?
- 25. Obtener una ruta de un proceso en ejecución por nombre
- 26. ¿Cómo se conecta strace a un proceso ya en ejecución?
- 27. ¿Cómo verificar un proceso en ejecución con Ruby?
- 28. Proceso en error de trabajador de fondo
- 29. ¿Cómo puedo verificar si hay un proceso en ejecución por sesión de usuario?
- 30. ¿Cómo puedo capturar el stdout de un proceso que YA está en ejecución?
¿Le permite pausar la ejecución? – Zubair