2013-12-10 18 views
8

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:

  1. 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.

  2. 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)

+0

Xem thêm: http://stackoverflow.com/questions/11709639/how-to-catch-ctrlc-in-clojure –

+0

Xem thêm: http://stackoverflow.com/questions/18612063/clojure- core-async-cpu-hangs-after-timeout –

Trả lời

4

go trả về một kênh. Bạn có thể muốn (close! chan) trong móc tắt máy.

Nếu bạn chạy lein run, bạn cần có chức năng chính sẽ gọi số (run) để bắt đầu chuỗi.

(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

Bạn có thấy thông báo tắt khi bạn (a) chạy từ REPL hay không; (b) chạy qua 'lein run'? –

+0

Không có thông báo tắt máy trong trường hợp (a) 'lein repl', trường hợp (b)' lein run' không hiển thị tắt máy – edbond

+0

Nếu tôi chạy 'lein trampoline repl' tắt hiển thị khi tôi thoát bằng' Ctrl-D' hoặc sử dụng ' (exit) 'function – edbond

-1

Về phần 1: "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. " Tôi nghĩ rằng thread tắt máy không được kết nối với giao diện điều khiển của lein repl.

Về phần 2: Sau khi vòng lặp đi được bắt đầu, nó chạy trong chủ đề nền. Kể từ khi thoát khỏi chuỗi chính sau khi tạo khối di chuyển, chương trình sẽ tắt. Để làm cho vòng lặp tồn tại lâu dài, nó cần phải được đặt trong một bình thường loop. (Nó cũng là cách đẹp hơn để đặt một Thread/sleep bên trong!)

+1

các khối không chạy trong chủ đề –

Các vấn đề liên quan