我已經開始使用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