Tôi có vòng lặp đi lặp lại cấp cao nhất core.async. Tôi muốn nó chạy vô thời hạn, ít nhất là cho đến khi tôi báo hiệu nó dừng lại với CTRL-C hoặc kill hoặc tương tự. Tôi hiện đang sử dụng java.lang.Runtime/addShutdownHook như thế này:Duyên dáng thoát khỏi lõi Clojure.async chuyển vòng lặp trên giết
(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")))
Dưới đây là vấn đề của tôi:
Nếu tôi bắt đầu REPL và
(run)
sau đó nó bắt đầu và chạy trong một thread nền. Khi tôi thoát khỏi REPL, tôi không thấy thông báo tắt máy mong muốn.Tuy nhiên, khi tôi chạy từ
lein run
, vòng lặp go sẽ thoát ngay lập tức và hiển thị "SHUTDOWN".
Không phải là điều tôi muốn.
Tôi không nhất thiết phải tìm ra giải pháp phù hợp với tất cả các JVM. Tôi phát triển trên máy Mac và triển khai đến Ubuntu, vì vậy tôi muốn tìm một giải pháp mà làm việc cho cả hai:
Mac JVM: Phiên bản java "1.7.0_45" Java (TM) SE Runtime Environment (xây dựng 1.7.0_45-b18) Máy chủ Java HotSpot (TM) 64-bit máy chủ (xây dựng 24.45-b08, chế độ hỗn hợp)
Ubuntu JVM: java version "1.7.0_25" OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2) Máy chủ OpenJDK 64-bit (xây dựng 23.7-b01, chế độ hỗn hợp)
Xem thêm: http://stackoverflow.com/questions/11709639/how-to-catch-ctrlc-in-clojure –
Xem thêm: http://stackoverflow.com/questions/18612063/clojure- core-async-cpu-hangs-after-timeout –