6

默认情况下 (go..) 将使用两倍的内核数 + 42 个 线程作为线程池。有什么方法可以通过设置环境变量或某事来设置代码可以使用的线程数或 CPU 数?

在 linux 机器上,我可以使用任务集设置 CPU数量,例如 taskset -c 0,1 my_Java_or_Clojure_program,尽管任务集似乎对返回的数量无效(-> (java.lang.Runtime/getRuntime) .availableProcessors)

4

2 回答 2

14

当前接受的答案在此提交之前有效,因此基本上现在您有两种情况:

  • 如果您只想更改池中的最大线程数,请将数字作为 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)))
    
于 2016-07-25T21:40:43.550 回答
11

在当前 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]>

注意: Core.async 仍处于 alpha 阶段,因此希望将来会有所改变。

于 2013-09-13T06:32:53.697 回答