gpt4 book ai didi

performance - Clojure core.async 用于数据计算

转载 作者:行者123 更新时间:2023-12-04 02:33:53 26 4
gpt4 key购买 nike

我已经开始使用 clojure core.async 库。我发现 CSP、channels、go block 的概念真的很容易使用。但是,我不确定我是否正确使用它们。我有以下代码 -

(def x-ch (chan))
(def y-ch (chan))
(def w1-ch (chan))
(def w2-ch (chan))

; they all return matrices
(go (>! x-ch (Mat/* x (map #(/ 1.0 %) (max-fold x)))))
(go (>! y-ch (Mat/* y (map #(/ 1.0 %) (max-fold y)))))
(go (>! w1-ch (gen-matrix 200 300)))
(go (>! w2-ch (gen-matrix 300 100)))

(let [x1 (<!! (go (<! x-ch)))
y1 (<!! (go (<! y-ch)))
w1 (<!! (go (<! w1-ch)))
w2 (<!! (go (<! w2-ch)))]

;; do stuff w/ x1 y1 w1 w2
)

我在符号 x 中有预定义的(矩阵)向量和 y .我需要在使用它们之前修改这两个向量。这些向量非常大。我还需要生成两个随机矩阵。由于 go宏异步启动计算,我将所有四个计算任务分成单独的 go block ,并将结果放入 channel 中。然后我有一个 let block ,我从 channel 中获取值并将它们存储到符号中。他们都在使用阻塞 <!!接受函数,因为它们在主线程上。

我要做的基本上是通过将程序片段分成异步进程来加快我的计算时间。这是正确的方法吗?

最佳答案

对于这种处理,future可能稍微够用。

链接中的示例很容易掌握:

 (def f 
(future
(Thread/sleep 10000)
(println "done")
100))

处理,future block 立即启动,所以上面确实启动了一个线程,等待 10s 并在完成后打印“done”。

当您需要该值时,您可以使用:
(deref f)
; or @f

它将阻塞并返回 future 代码块的值。

在同一个示例中,如果您在 10 秒过去之前调用 deref,则调用将阻塞,直到计算完成。

在您的示例中,由于您只是在等待计算完成,并且不太关心 channel 参与者之间的消息和交互,因此我建议您这样做。所以:
 (future 
(Mat/* x (map #(/ 1.0 %) (max-fold x))))

关于performance - Clojure core.async 用于数据计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33204899/

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