Multithreading Clojure core.async,有没有办法控制(go…)线程池中的线程数?
默认情况下(go..)将为线程池使用线程。有没有办法通过设置环境变量或其他方式来设置代码可以使用的线程数或CPU数 在linux机器上,我可以使用。Multithreading Clojure core.async,有没有办法控制(go…)线程池中的线程数?,multithreading,clojure,cpu-usage,core.async,Multithreading,Clojure,Cpu Usage,Core.async,默认情况下(go..)将为线程池使用线程。有没有办法通过设置环境变量或其他方式来设置代码可以使用的线程数或CPU数 在linux机器上,我可以使用。 任务集-c 0,1 my\u Java\u或\u Clojure\u程序,尽管任务集似乎对(>(Java.lang.Runtime/getRuntime).availableProcessors)返回的数字无效 在当前Clojure版本的core.async中,线程池执行器位于Clojure.core.async.impl.dispatch命名空间
任务集-c 0,1 my\u Java\u或\u Clojure\u程序
,尽管任务集似乎对(>(Java.lang.Runtime/getRuntime).availableProcessors)返回的数字无效
在当前Clojure版本的core.async中,线程池执行器位于Clojure.core.async.impl.dispatch
命名空间中。您可以更改executor
var并提供自定义线程池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]>
(ns沙箱)
(:require[clojure.core.async.impl.concurrent:as conc]
[clojure.core.async.impl.exec.threadpool:as-tp]
[clojure.core.async:as async]))
(我的遗嘱执行人)
(java.util.concurrent.Executors/newFixedThreadPool)
1.
(conc/counted线程工厂“我的异步调度-%d”true))
(更改var root#'clojure.core.async.impl.dispatch/executor
(持续(延迟(tp/线程池执行器我的执行器)))
(异步/去
(println
(线程/当前线程));=>#
注意:Core.async仍处于alpha状态,因此,希望将来会有所改变。目前公认的答案是有效的,因此基本上现在有两种情况:
- 如果只想更改池中的最大线程数,可以将该数作为Java属性传递(默认值为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)))