相关疑难解决方法(0)

如何在Clojure中捕获CTRL + C?

我有一个简单的单线程Clojure程序,它创建一个用于交换数据的临时文件.当程序正常退出时,该文件将被删除,但是当程序通过Ctrl+ C,Ctrl+ DCtrl+ 退出时,Z该位代码将永远不会执行.我需要它来执行程序退出的方式.我知道我需要捕捉到这个信号(我以前用其他语言做过),但我似乎无法弄清楚如何在Clojure中做到这一点.

signals clojure

16
推荐指数
1
解决办法
3360
查看次数

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

基于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")) …
Run Code Online (Sandbox Code Playgroud)

multithreading asynchronous clojure core.async

7
推荐指数
1
解决办法
1881
查看次数