gpt4 book ai didi

concurrency - 了解 Clojure 并发示例

转载 作者:行者123 更新时间:2023-12-04 14:51:43 24 4
gpt4 key购买 nike

我只是浏览了有关 Clojure 并发的各种文档,并在网站 (http://clojure.org/concurrent_programming) 上看到了示例。

(import '(java.util.concurrent Executors))
(defn test-stm [nitems nthreads niters]
(let [refs (map ref (replicate nitems 0))
pool (Executors/newFixedThreadPool nthreads)
tasks (map (fn [t]
(fn []
(dotimes [n niters]
(dosync
(doseq [r refs]
(alter r + 1 t))))))
(range nthreads))]
(doseq [future (.invokeAll pool tasks)]
(.get future))
(.shutdown pool)
(map deref refs)))

我了解它的作用和工作原理,但我不明白为什么需要第二个匿名函数 fn[]?

非常感谢,

杜沙。

附言没有这第二个 fn [] 我得到 NullPointerException。

最佳答案

这是使用高阶函数的经典示例:

;; a function returns another function
(defn make-multiplyer [times]
(fn [x]
(* x times)))

;; now we bind returned function to a symbol to use it later
(def multiply-by-two (make-multiplyer 2))

;; let's use it
(multiply-by-two 100) ; => 200

在该代码示例中, fn 内的 fn 工作方式相同。当 map 调用 (fn [t] (fn [] ...)) 时,它会得到内部 fn。
(def list-of-funcs (map (fn [t]
(fn [] (* t 10))) ; main part
(range 5)))
;; Nearly same as
;; (def list-of-funcs (list (fn [] (* 0 10))
;; (fn [] (* 1 10))
;; ...
;; (fn [] (* 4 10))))


(for [i list-of-funcs]
(i))
; => (0 10 20 30 40)

更新:正如 Alex 所说,代码示例中的任务绑定(bind)到可调用列表,然后传递给 .invokeAll()。

关于concurrency - 了解 Clojure 并发示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4611308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com