6

デフォルトでは (go..) は、コア数の 2 倍 + 42 スレッドをスレッド プールに使用します。環境変数または sth を設定することで、コードが使用できるスレッドの数または CPU の数を設定する方法はありますか?

Linux マシンでは、taskset 使用して CPU の数を設定できます。 taskset -c 0,1 my_Java_or_Clojure_program(-> (java.lang.Runtime/getRuntime) .availableProcessors)

4

2 に答える 2

14

現在受け入れられている回答はこのコミットまで有効だったので、基本的には次の 2 つのケースがあります。

  • プール内のスレッドの最大数を変更するだけの場合は、数値を 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 はまだアルファ版であるため、将来変更されることを願っています。

于 2013-09-13T06:32:53.697 に答える