我已经开始使用clojure core.async库。我发现CSP,通道,块的概念非常易于使用。但是,我不确定我是否正确使用它们。我有下面的代码 -用于数据计算的Clojure core.async
(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
宏异步启动计算,因此我将所有四个计算任务分解为单独的转移块,并将后续结果放入通道中。然后我得到一个让我从这些通道获取数值并将它们存储为符号的区块。他们都使用阻止<!!
采取功能,因为他们在主线程。
我想要做的事情基本上是通过将程序片段拆分为异步进程来加速我的计算时间。这是做到这一点的正确方法吗?
为什么你想在这里使用异步代码?异步代码在您需要阻止和等待时有效。否则,它什么都不做。当你只需要做数学运算时,你应该直接或并行计算它,例如将来。 – JustAnotherCurious
谢谢你。在我的代码中,我同时开始4次计算并阻止/等待值,直到它们返回某些值。这与异步块/等待有何不同?然而,就像尼古拉斯和你指出的那样,我将会为此而使用未来。我能否在go块中使用core.reducers?或者这会是一个可怕的想法? – Lordking
你不能在同一时间启动它们。所有内容都按顺序执行,因为在go块中没有有价值的阻止操作。我定义了函数“素数?”测试数字是否为总数。看这里:“(time(do(count(filter true)(map prime?(range 2 20000))))))”3 seconds and“(time(count(filter true)(map prime?(range 2 20000 )))))“给出3秒。您只使用一个线程,并且所有内容都是顺序的。测试它! – JustAnotherCurious