基于core.async演示例子,我创建了下面类似的代码来处理一些使用多个通道进行的耗费CPU的工作,带有10秒的超时时间。然而,在主线程返回后,CPU使用率仍保持在大约700%(8个CPU的机器)。我必须手动在emacs中运行nrepl-close才能关闭Java进程。
是否有任何适当的方法来终止由(go..)块产生的宏线程?我尝试关闭每个通道,但它不起作用。我想确保主线程返回后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
;;https://dev59.com/MHA75IYBdhLWcg3wg5fs
(defn list-contains? [coll value]
(let [s (seq coll)]
(if s
(if (= (first s) value) true (recur (rest s) value))
false)))
(while @running ...)
这样的原子,或者让该块在每次迭代时从另一个通道中获取数据,只要您希望go block继续运行即可。 - Leon Grapenthinlist-contains?
函数,并且只需要简单地使用(if (cs source) ...)
即可。 - Leon Grapenthin