Come posso creare un processo in background in esecuzione costante in Clojure? Sta usando "futuro" con un loop che non finisce mai nel modo giusto?Come posso creare un processo in background costantemente in esecuzione in Clojure?
risposta
Si potrebbe semplicemente iniziare una discussione con una funzione che funziona per sempre.
(defn forever []
;; do stuff in a loop forever
)
(.start (Thread. forever))
Se non si desidera che il thread in background per bloccare l'uscita di processo, assicuratevi di farne un thread demone:
(doto
(Thread. forever)
(.setDaemon true)
(.start))
Se volete un po 'più finezza è possibile utilizzare il java.util .concurrent.Executors factory per creare un ExecutorService. Ciò semplifica la creazione di pool di thread, utilizza filettature personalizzate, code in entrata personalizzate, ecc.
La lib di claypoole avvolge alcune delle risorse di esecuzione del lavoro in un'API più clojure-friendly se è quello che stai pescando in direzione.
Forse, o forse il demone Lein? https://github.com/arohner/lein-daemon
mio semplice ordine superiore funzione loop infinito (ricorrendo a future):
(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
mi consiglia di utilizzare un atomo o uno Clojures altri tipi di riferimento per memorizzare i risultati (come per il contatore nell'esempio precedente).
Con un po 'di regolazione è anche possibile utilizzare questo approccio per avviare/arrestare/sospendere il processo in modalità thread-safe (ad esempio, testare un flag per vedere se (funzione) deve essere eseguita in ogni iterazione del ciclo) .
p.s. anche bello sapere che il sovraccarico di questo approccio è piuttosto minimo - puoi ottenere oltre un milione di incrementi al secondo se togli il thread/sleep – mikera
Un'altra implementazione semplice che non consumerà stack '(defn infinito [f secondi] (futuro (loop [] (f) (Thread/sleep (* secondi 1000)) (ripetizione)))) ' –
@James - la mia implementazione non consuma neanche stack. Il fatto che la chiamata ricorsiva a 'infinito-loop' sia all'interno di un futuro significa che non è ricorrente all'interno dello stack frame della funzione originale. – mikera
- 1. Come creare un servizio in background sempre in esecuzione?
- 2. Esecuzione di un comando come processo/servizio in background
- 3. Processo in esecuzione in background dopo la chiusura del terminale
- 4. Perché Microsoft.Office.Interop.Excel.Application.Quit() lascia in esecuzione il processo in background?
- 5. Esecuzione di script Python come processo in background di Windows
- 6. Come posso inserire il processo corrente di Linux in esecuzione in background?
- 7. Processo in background in linux
- 8. Applicazione in esecuzione in background
- 9. Come riportare un processo in background orfano in primo piano?
- 10. React processo in background nativo
- 11. Un server è un loop infinito in esecuzione come processo in background?
- 12. Come si esegue exec() un processo in background in C?
- 13. Esegui processo in background in Android
- 14. In esecuzione: make da gVim in background
- 15. Esecuzione di matlab in background
- 16. Come posso verificare un processo in esecuzione per sessione utente?
- 17. Come uccidere un processo Python in esecuzione?
- 18. Come si elimina un processo specifico in esecuzione in background dal prompt dei comandi?
- 19. Processo in background con esecuzione prolungata in ASP.NET - Application_Start o processo separato?
- 20. Esecuzione di WebView in background
- 21. Monitorare costantemente un programma/processo usando Python
- 22. Come posso avviare un processo e metterlo in background in python?
- 23. processo in background in java ascoltando stdin
- 24. Django: avvia un processo in un thread in background?
- 25. PID dell'ultimo processo in esecuzione in Windows
- 26. Python REPL per un processo in esecuzione
- 27. Esecuzione di un programma Java in background in Tomcat
- 28. Rails Creazione di un nuovo thread o processo in background
- 29. Programma Java in esecuzione in background
- 30. Avvia un processo in background in Linux con C
Permette di sospendere l'esecuzione? – Zubair