core.async walk through exampleに基づいて、以下の同様のコードを作成し、10 秒のタイムアウトで複数のチャネルを使用して CPU を集中的に使用するジョブを処理しました。ただし、メインスレッドが戻った後、CPU 使用率は約 700% のままです (8 CPU マシン)。Java プロセスをシャットダウンするには、emacs で手動で nrepl-close を実行する必要があります。
(go..) block によって生成されたマクロスレッドを強制終了する適切な方法はありますか? 近づいてみた!それぞれのちゃんですが、うまくいきません。メインスレッドが戻った後、JavaプロセスによってCPU使用率が0に戻ることを確認したい。
(defn [] RETURNED-STR-FROM-SOME-CPU-INTENSE-JOB (do... (str ...)))
(let [n 1000
cs (repeatedly n chan)]
(doseq [c cs]
(go
(>! c (RETURNED-STR-FROM-SOME-CPU-INTENSE-JOB ))))
(dotimes [i n]
(let [[result source] (alts!! (conj cs (timeout 10000))) ] ;;wait for 10 seconds for each job
(if (list-contains? cs source) ;;if returned chan belongs to cs
(prn "OK JOB FINISHED " result)
(prn "JOB TIMEOUT")
)))
(doseq [i cs]
(close! i)) ;;not useful for "killing" macro thread
(prn "JOBS ARE DONE"))
;;Btw list-contains? function is used to judge whether an element is in a list
;;http://stackoverflow.com/questions/3249334/test-whether-a-list-contains-a-specific-value-in-clojure
(defn list-contains? [coll value]
(let [s (seq coll)]
(if s
(if (= (first s) value) true (recur (rest s) value))
false)))