У меня есть верхний уровень core.async go loop. Я хочу, чтобы он работал бесконечно, по крайней мере, до тех пор, пока я не передам его, чтобы он остановился с CTRL-C или kill или аналогичным. Я в настоящее время использую java.lang.Runtime/addShutdownHook так:Изящно выйти из Clojure core.async go loop on 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")))
Вот мои проблемы:
Если я начинаю REPL и
(run)
затем он начинает и работает в фоновом потоке. Когда я выхожу из REPL, я не вижу желаемого сообщения о завершении работы.Однако, когда я бегу от
lein run
, цикл хода выходит сразу и отображает «SHUTDOWN».
Ни то, что я хочу.
Я не обязательно ожидаю найти решение, которое работает для всех JVM. Я разрабатываю на Mac и развернуть в Ubuntu, поэтому я хотел бы, чтобы найти решение, которое работает для обоих:
Mac JVM: Java версии "1.7.0_45" Java (TM) SE Runtime Environment (сборка 1.7.0_45-b18) Виртуальная виртуальная машина Java HotSpot TM TM (сборка 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-разрядный сервер ВМ (сборка 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 –