我已经开始使用clojure core.async库了.我发现CSP,channel,go blocks的概念非常容易使用.但是,我不确定我是否正确使用它们.我有以下代码 – (def x-ch (chan))(def y-ch (chan))(def w1-ch (chan))(def w2-ch (ch
(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块,并将后续结果放入通道中.然后我有一个let块,我从通道中获取值并将它们存储到符号中.他们都使用阻止< !!因为它们在主线程上,所以需要它们. 我正在尝试做的基本上是通过将程序片段分成异步进程来加快我的计算时间.这是正确的方法吗?
go块返回带有表达式结果的通道,因此您无需为其结果创建中间通道.下面的代码允许您同时启动所有4个计算,然后阻止值直到它们返回.如果您不需要立即获得某些结果,则只有在实际使用时才能阻止该值.(let [x1-ch (go (Mat/* x (map #(/ 1.0 %) (max-fold x))))
y1-ch (go (Mat/* y (map #(/ 1.0 %) (max-fold y))))
w1-ch (go (gen-matrix 200 300))
w2-ch (go (gen-matrix 300 100))
x1 (<!! x1-ch)
y1 (<!! y1-ch)
w1 (<!! w1-ch)
w2 (<!! w2-ch)]
;; do stuff w/ x1 y1 w1 w2
)
