10

トップレベルのcore.async go ループがあります。少なくともCTRL-Cまたはkillなどで停止するように通知するまで、無期限に実行したい. 現在、次のようにjava.lang.Runtime/addShutdownHookを使用しています。

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

ここに私の問題があります:

  1. REPL を開始する(run)と、バックグラウンド スレッドで開始および実行されます。REPL を終了すると、目的のシャットダウン メッセージが表示されません。

  2. ただし、から実行するlein runと、go ループがすぐに終了し、「SHUTDOWN」と表示されます。

どちらも私が欲しいものではありません。

すべての JVM で機能するソリューションが見つかるとは限りません。私は Mac で開発し、Ubuntu にデプロイするので、両方で機能するソリューションを見つけたいと思います。

  • Mac JVM: Java バージョン "1.7.0_45" Java(TM) SE ランタイム環境 (ビルド 1.7.0_45-b18) 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 (ビルド 23.7-b01、混合モード)

4

3 に答える 3

-1

パート 1 について: 「REPL を終了すると、必要なシャットダウン メッセージが表示されません。」lein replシャットダウン スレッドがのコンソールに接続されていないと思います。

パート 2 について: go ループが開始された後、バックグラウンド スレッドで実行されます。go ブロックを作成した後、メイン スレッドが終了するため、プログラムはシャットダウンします。ループを長持ちさせるには、通常の に配置する必要がありますloop。(中に入れるのもThread/sleepいいですね!)

于 2013-12-10T04:19:21.510 に答える