Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.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
Concurrency Clojure-定义Pmap中使用的线程数_Concurrency_Clojure - Fatal编程技术网

Concurrency Clojure-定义Pmap中使用的线程数

Concurrency Clojure-定义Pmap中使用的线程数,concurrency,clojure,Concurrency,Clojure,我正在尝试在Clojure中使用pmap为我的映射使用并发性,并且我需要根据程序在不同线程数下的效率进行一些分析 Clojure中定义的线程数是在pmap函数中还是在项目文件中的某个位置?查看pmap文档,与映射功能相比,没有其他参数 例如,我需要在2,32,64等下运行程序。。。线程。您的问题似乎密切相关,足以: 从的答案可以推断pmap使用的线程数为+2。我不知道为什么会有一个+2,但即使在当前版本的Clojure 1.10.0中,pmap函数的源代码仍然是一样的 由于我的机器上有4个内核

我正在尝试在Clojure中使用pmap为我的映射使用并发性,并且我需要根据程序在不同线程数下的效率进行一些分析

Clojure中定义的线程数是在pmap函数中还是在项目文件中的某个位置?查看pmap文档,与映射功能相比,没有其他参数


例如,我需要在2,32,64等下运行程序。。。线程。

您的问题似乎密切相关,足以:

从的答案可以推断pmap使用的线程数为
+2
。我不知道为什么会有一个
+2
,但即使在当前版本的Clojure 1.10.0中,
pmap
函数的源代码仍然是一样的

由于我的机器上有4个内核,
pmap
应该使用6个线程

--编辑

要真正回答您的问题,您可以定义一个自定义pmap函数,
自定义pmap
,该函数允许您指定要使用的线程数:

(定义自定义pmap)
([f coll nb螺纹]
(让[n]nb线
rets(地图#(未来(f%)coll)
步骤(fn步骤[[x&xs:as vs]fs]
(续)
(如果让[s(seq fs)]
(反对(第x步)(第x步(其余部分)))
(地图编号vs))]
(步骤rets(下降n rets(()())))
(定制pmap公司(范围1000)8)
;; => (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ....999 1000)

您的问题似乎密切相关,足以:

从的答案可以推断pmap使用的线程数为
+2
。我不知道为什么会有一个
+2
,但即使在当前版本的Clojure 1.10.0中,
pmap
函数的源代码仍然是一样的

由于我的机器上有4个内核,
pmap
应该使用6个线程

--编辑

要真正回答您的问题,您可以定义一个自定义pmap函数,
自定义pmap
,该函数允许您指定要使用的线程数:

(定义自定义pmap)
([f coll nb螺纹]
(让[n]nb线
rets(地图#(未来(f%)coll)
步骤(fn步骤[[x&xs:as vs]fs]
(续)
(如果让[s(seq fs)]
(反对(第x步)(第x步(其余部分)))
(地图编号vs))]
(步骤rets(下降n rets(()())))
(定制pmap公司(范围1000)8)
;; => (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ....999 1000)
您可以使用claypoole,它将某个大小的线程池作为第一个参数

# project.clj
[com.climate/claypoole "1.1.4"]

# or deps.edn
com.climate/claypoole {:mvn/version "1.1.4"}
现在,让我们指定一些池大小,并映射一个在大小为64的集合上花费1秒的操作

(ns demo
  (:refer-clojure :exclude-clojure [pmap])
  (:require [com.climate.claypoole :refer [threadpool pmap]]))

(def pool-sizes 
  [2 32 64]) 

(doseq [pool-size pool-sizes]
  (time (doall (pmap (threadpool pool-size) (fn [n] (Thread/sleep 1000)) (range 64)))))
“运行时间:32113.704013毫秒”
“运行时间:2013.242638毫秒”
“运行时间:1011.616369毫秒”

因此,对于大小为2的线程池,需要一些开销和32秒,对于大小为32的线程池,需要2秒,对于大小为64的线程池,需要1秒。

可以使用claypoole,它将某个大小的线程池作为第一个参数

# project.clj
[com.climate/claypoole "1.1.4"]

# or deps.edn
com.climate/claypoole {:mvn/version "1.1.4"}
现在,让我们指定一些池大小,并映射一个在大小为64的集合上花费1秒的操作

(ns demo
  (:refer-clojure :exclude-clojure [pmap])
  (:require [com.climate.claypoole :refer [threadpool pmap]]))

(def pool-sizes 
  [2 32 64]) 

(doseq [pool-size pool-sizes]
  (time (doall (pmap (threadpool pool-size) (fn [n] (Thread/sleep 1000)) (range 64)))))
“运行时间:32113.704013毫秒”
“运行时间:2013.242638毫秒”
“运行时间:1011.616369毫秒”

因此,对于大小为2的线程池,开销为32秒;对于大小为32的线程池,开销为2秒;对于大小为64的线程池,开销为1秒