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



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

Clojure中定义的线程数是在pmap函数中还是在项目文件中?查看pmap文档,与地图功能相比,没有其他参数。

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

您的问题似乎与以下问题密切相关:Clojure';用于URL提取操作的pmap函数派生?

根据Alex Miller的回答,你可以推断出pmap使用的线程数是<your number of core> + 2。我不知道为什么会有+ 2,但即使使用当前版本的Clojure 1.10.0,pmap函数的源代码仍然是一样的。

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

--编辑

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

(defn custom-pmap
([f coll nb-thread]
(let [n nb-thread
rets (map #(future (f %)) coll)
step (fn step [[x & xs :as vs] fs]
(lazy-seq
(if-let [s (seq fs)]
(cons (deref x) (step xs (rest s)))
(map deref vs))))]
(step rets (drop n rets)))))
(custom-pmap inc (range 1000) 8)
;; => (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ....999 1000)

您可以使用claypool的pmap,它将特定大小的线程池作为第一个参数。

# 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秒。

最新更新