如果您只想更改池中线程的最大数量,则将该数字作为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)))
在当前的Clojure core.async版本中,线程池执行器位于clojure.core.async.impl.dispatch
命名空间中。您可以更改executor
变量并提供自定义线程池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]>
注意:Core.async仍处于alpha版本,因此希望这将来会有所改变。