Kev*_*Zhu 6 multithreading clojure cpu-usage core.async
默认情况下(go ..)将使用两倍的核心数+ 42个 线程用于线程池.有什么办法可以通过设置环境变量或者sth设置线程数或代码可以使用的CPU数量吗?
在linux机器上,我可以使用taskset设置CPU的数量,例如
taskset -c 0,1 my_Java_or_Clojure_program,虽然taskset似乎对返回的数字没有效果(-> (java.lang.Runtime/getRuntime) .availableProcessors).
And*_*rdi 11
目前接受的答案在此提交之前是有效的,所以基本上现在你有两种情况:
如果您只想更改池中的最大线程数,请将该数字作为Java属性传递clojure.core.async.pool-size(默认为8)
如果你想替换它ExecutorService,你使用相同的技巧,alter-var-root但目标是新的实现(有一个协议来实现):
(ns your-app.threadpool
(:require [clojure.core.async.impl.protocols :as protocols]
[clojure.core.async.impl.concurrent :as conc]
[clojure.core.async.impl.exec.threadpool :as tp])
(:import java.util.concurrent.Executors))
(defonce my-executor
(let [executor-svc (Executors/newFixedThreadPool
1
(conc/counted-thread-factory "async-dispatch-%d" true))]
(reify protocols/Executor
(protocols/exec [this r]
(.execute executor-svc ^Runnable r)))))
(alter-var-root #'clojure.core.async.impl.dispatch/executor
(constantly (delay my-executor)))
Run Code Online (Sandbox Code Playgroud)在当前Clojure版本的core.async中,线程池执行程序位于clojure.core.async.impl.dispatch命名空间中.您可以更改executorvar并提供自定义线程池ExecutorService.
(ns sandbox
(:require [clojure.core.async.impl.concurrent :as conc]
[clojure.core.async.impl.exec.threadpool :as tp]
[clojure.core.async :as async]))
(defonce my-executor
(java.util.concurrent.Executors/newFixedThreadPool
1
(conc/counted-thread-factory "my-async-dispatch-%d" true)))
(alter-var-root #'clojure.core.async.impl.dispatch/executor
(constantly (delay (tp/thread-pool-executor my-executor))))
(async/go
(println
(Thread/currentThread))) ;=> #<Thread Thread[my-async-dispatch-1,5,main]>
Run Code Online (Sandbox Code Playgroud)
注意: Core.async仍处于alpha状态,因此希望将来会发生变化.
| 归档时间: |
|
| 查看次数: |
2859 次 |
| 最近记录: |