user> (every? true? '()) ;empty is true?
true
user> (every? false? '()) ;empty is false?
true
Run Code Online (Sandbox Code Playgroud)
这确实是奇怪的,可能是不合逻辑的,因为我认为上述两者都是假的.有人可以说明这背后的理由吗?
基于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) 默认情况下(go ..)将使用两倍的核心数+ 42个 线程用于线程池.有什么办法可以通过设置环境变量或者sth设置线程数或代码可以使用的CPU数量吗?
在linux机器上,我可以使用taskset设置CPU的数量,例如
taskset -c 0,1 my_Java_or_Clojure_program
,虽然taskset似乎对返回的数字没有效果(-> (java.lang.Runtime/getRuntime) .availableProcessors)
.
我有两个序列用于比较,我需要在地图中保留比较结果,第一个序列中的数据用作键,第二个用作val.这是一个有效的示例代码
(def myAtom (atom {}))
(map #(if (== %1 %2) (swap! myAtom assoc %1 %2 ))
[1 2 3] [4 5 3])
(prn @myAtom) ; ==> {3 3}
Run Code Online (Sandbox Code Playgroud)
然而,在将"相同"的东西放到一个let绑定之后,它就不再起作用了
(let [ myAtom (atom {})]
(map #(if (== %1 %2) (swap! myAtom assoc %1 %2 ))
[1 2 3] [4 5 3])
(prn @myAtom)) ;;==> {} empty???
Run Code Online (Sandbox Code Playgroud)
所以问题是,myAtom里面发生了什么让绑定?怎么会丢失?
对于下面,为什么最后一个返回零?功能"some"不适用于列表列表?
(some #(= % 1) '(1 3) ) ; ==> true
(some #(= % '(1 3)) ['(1 3) '(1 2 3)] ) ; ==> true
(some #(= % '(1 3)) '('(1 3) '(1 2 3)) ) ;==> nil
Run Code Online (Sandbox Code Playgroud) clojure ×5
core.async ×2
asynchronous ×1
cpu-usage ×1
dictionary ×1
let ×1
lisp ×1
list ×1
swap ×1