Clojure core.async,任何控制该(go ...)线程池中线程数的方法?

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)


Jar*_*314 9

在当前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状态,因此希望将来会发生变化.

  • 我只是添加了这项工作,当且仅当你在core.async调用创建函数之前更改了var时,所以这应该在你的程序中很早就需要 (2认同)