2013-12-10 10 views
8

Ich habe eine Top-Level-core.async Go-Schleife. Ich möchte, dass es unbegrenzt läuft, zumindest bis ich es signalisiere, mit CTRL-C oder kill oder ähnlichem zu stoppen. Ich bin derzeit mit java.lang.Runtime/addShutdownHook wie folgt aus:Verlassen Sie eine Clojure core.async go Schleife auf Kill

(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"))) 

Hier meine Probleme sind:

  1. Wenn ich die REPL starten und (run) dann startet und läuft in einem Hintergrundthread. Wenn ich die REPL verlasse, sehe ich nicht die gewünschte Nachricht zum Herunterfahren.

  2. Wenn ich jedoch von lein run starte, wird die go-Schleife sofort beendet und "SHUTDOWN" angezeigt.

Weder ist was ich will.

Ich erwarte nicht unbedingt eine Lösung, die für alle JVM funktioniert. Ich entwickle auf einem Mac und bereitstellen zu Ubuntu, so möchte ich eine Lösung zu finden, die für beide Werke:

  • Mac JVM: java version "1.7.0_45" Java (TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot (TM) 64-Bit-Server-VM (Build 24.45-b08, gemischter Modus)

  • Ubuntu JVM: Java-Version "1.7.0_25" OpenJDK-Laufzeitumgebung (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2) OpenJDK 64-Bit-Server VM (build 23,7-B01, mixed mode)

+0

Siehe auch: http://stackoverflow.com/questions/11709639/how-to-catch-ctrlc-in-clojure –

+0

Siehe auch: http://stackoverflow.com/questions/18612063/clojure- core-async-cpu-hängt-nach-timeout –

Antwort

4

go Funktion gibt einen Kanal zurück. Möglicherweise möchten Sie (close! chan) im Shutdown-Hook.

Wenn Sie lein run ausführen, benötigen Sie eine Hauptfunktion, die (run) aufrufen wird, Thread zu starten.

(ns async-demo.core 
    (:require [clojure.core.async :as async 
      :refer [<! >! <!! timeout chan alt! go close!]])) 

(def ch (atom nil)) 

(defn run [] 
    (go (while true 
     (<! (timeout 500)) 
     (prn "inside go")))) 

(defn -main [& args] 
    (println "Starting") 
    (reset! ch (run)) 
    (.addShutdownHook (Runtime/getRuntime) 
        (Thread. #(do 
           (println "SHUTDOWN") 
           (close! @ch)))) 
    (while true 
    (<!! @ch))) 
+0

Sie sehen die Nachricht zum Herunterfahren, wenn Sie (a) von der REPL laufen; (b) über "lein run" laufen? –

+0

Es gibt keine Nachricht zum Herunterfahren, wenn (a) 'lein repl', Fall (b)' lein run' zeigt shutdown – edbond

+0

Wenn ich 'lein trampoline repl' herunterfahre Display wenn ich mit' Ctrl-D' oder mit ' (Ausgang) 'Funktion – edbond

-1

zu Teil 1: „Wenn ich die Ausfahrt REPL, ich sehe die gewünschte Nachricht zum Herunterfahren nicht. " Ich denke, der Thread zum Herunterfahren ist nicht mit der Konsole lein repl verbunden.

Zu Teil 2: Nachdem die go-Schleife gestartet wurde, wird sie in Hintergrundthreads ausgeführt. Da der Haupt-Thread nach dem Erstellen des Go-Blocks beendet wird, wird das Programm beendet. Um die Schleife langlebig zu machen, muss sie in einen normalen loop gebracht werden. (Es ist auch viel schöner, eine Thread/sleep nach innen zu setzen!)

+1

go-Blöcke laufen nicht in Threads –