Ho un alto livello ciclo core.async andare. Voglio che venga eseguito a tempo indeterminato, almeno fino a quando faccio segno di fermarsi con CTRL-C o kill o simili. Attualmente sto usando java.lang.Runtime/addShutdownHook come questo:garbo uscire da un Clojure core.async andare loop su uccidere
(ns async-demo.core
(:require [clojure.core.async :as async
:refer [<! >! <!! timeout chan alt! go]]))
(defn run [] (go (loop [] (recur))))
(.addShutdownHook (Runtime/getRuntime) (Thread. #(println "SHUTDOWN")))
Qui sono i miei problemi:
Se comincio il REPL e
(run)
poi inizia e viene eseguito in un thread in background. Quando esco da REPL, non vedo il messaggio di spegnimento desiderato.Tuttavia, quando corro da
lein run
, il ciclo go si chiude immediatamente e visualizza "SHUTDOWN".
Né è quello che voglio.
Non necessariamente aspetto di trovare una soluzione che funziona per tutti JVM. I sviluppare su un Mac e distribuire a Ubuntu, quindi mi piacerebbe trovare una soluzione che funziona per entrambi:
Mac JVM: versione java "1.7.0_45" Java (TM) SE Runtime Environment (build 1.7.0_45-b18) VM server Java HotSpot (TM) a 64 bit (build 24.45-b08, modalità mista)
Ubuntu JVM: versione java "1.7.0_25" OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2) OpenJDK a 64 bit di server VM (build 23.7-b01, modalità mista)
Vedi anche: http://stackoverflow.com/questions/11709639/how-to-catch-ctrlc-in-clojure –
Vedi anche: http://stackoverflow.com/questions/18612063/clojure- core-async-cpu-hang-after-timeout –