私はトップレベルのcore.async goループを持っています。少なくともCTRL-Cまたはkillなどで停止するように通知するまで、無期限に実行します。私は現在、このようなjava.lang.Runtime/addShutdownHookを使用しています:ここで終了時にClojureのcore.async goループを正常に終了します
(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")))
は私の問題です:
私はREPLを起動し
(run)
場合、それが起動し、バックグラウンドスレッドで実行されます。私がREPLを終了するとき、私は希望のシャットダウンメッセージを表示しません。ただし、
lein run
から実行すると、goループがすぐに終了し、「シャットダウン」と表示されます。
どちらも希望しません。
私は、必ずしもすべてのJVMで動作する解決策を見つけるとは限りません。私は、Mac上で開発とUbuntuにデプロイするので、私は両方のために働く解決策を見つけるしたいと思います:
マックJVM:Javaのバージョン「1.7.0_45」Javaの(TM)SEランタイム環境(ビルドJava HotSpot(TM)64ビットサーバーVM(ビルド24.45-b08、混合モード)
Ubuntu JVM:javaバージョン "1.7.0_25" OpenJDKランタイム環境(IcedTea 2.3.10) 7u25-2.3.10-1ubuntu0.12.04.2)OpenJDKの64ビットサーバーVM(パート1について23.7-B01、混在モード)
も参照してください:http://stackoverflow.com/questions/11709639/how-to-catch-ctrlc-in-clojure –
参照します:http://stackoverflow.com/questions/18612063/clojure- core-async-cpu-hangs-after-timeout –