gpt4 book ai didi

multithreading - Clojure core.async,超时后CPU挂起。无论如何要正确杀死 (go..) block 产生的宏线程?

转载 作者:行者123 更新时间:2023-12-04 12:32:42 24 4
gpt4 key购买 nike

基于 core.async walk through example ,我在下面创建了类似的代码来使用多个 channel 处理一些 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
;;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)))

最佳答案

在 REPL 中,似乎还没有干净的方法。

我首先通过使用不推荐使用的方法 Thread.stop 尝试了一种非常肮脏的方式

 (doseq [i @threadpool ]
(.stop i))

一旦主线程返回到 REPL,CPU 使用率似乎下降了,但是如果我再次在 REPL 中运行程序,它只会卡在 go 块部分!!

然后我用谷歌搜索,发现 this blog它说

最后要注意的一件事:我们没有明确地做任何工作来关闭 go 例程。当 main 函数退出时,Go 例程会自动停止运行。因此,go 例程就像 JVM 中的守护线程(嗯,除了“线程”部分......)

所以我再次尝试将我的项目制作成一个 uberjar 并在命令控制台上运行它,结果当闪烁的光标返回到控制台时,CPU 使用率会立即下降!

关于multithreading - Clojure core.async,超时后CPU挂起。无论如何要正确杀死 (go..) block 产生的宏线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18612063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com