Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Clojure core.async,有没有办法控制(go…)线程池中的线程数?_Multithreading_Clojure_Cpu Usage_Core.async - Fatal编程技术网

Multithreading Clojure core.async,有没有办法控制(go…)线程池中的线程数?

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命名空间

默认情况下(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
命名空间中。您可以更改
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
    相同的技巧,但要针对新的实现(需要实现协议):


在core.async的代码中,它在哪里指定将使用“2+个内核”?我做了一些查找,但没有找到它。@David from here@David from the source code,它看起来像是处理器数量的两倍加上42,我要补充的是,只有在core.async调用creation函数之前修改var,这项工作才会起作用,所以在程序的早期应该需要这样做
(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)))