天天看點

《Clojure資料分析秘笈》——3.5節将agent和STM結合使用

本節書摘來自華章社群《clojure資料分析秘笈》一書中的第3章,第3.5節将agent和stm結合使用,作者(美)eric rochester,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.5 将agent和stm結合使用

agent本身非常實用。但是如果agent函數需要與agent外部資料保持一緻性,需要将agent和stm結合使用:使用send或send-off函數協調agent的狀态,将dosync、ref-set、alter或者commute整合至agent函數來協調其他狀态。

結合使用簡化了狀态和資料的一緻性問題。這對于管理資料處理和分析系統複雜度提供了極大的幫助。

本方法中,還是處理前幾個方法中的問題:在2010年美國人口普查資料中計算virginia每個住宅單元的家庭數。這次結構稍有變化。資料序列将在引用中,而不是在agent狀态中。也會使用計數器辨別agent是否完成。

3.5.1 準備工作

使用與3.2節中相同的依賴。除了相同的引用外,還需要導入java的包:

使用前幾種方法中的值和函數。在3.2節中,使用data-file、lazy-read-csv、with-heade、->int、sum-item和sum-items。在3.3節中,使用accum-sums、div-vec和force-val。

3.5.2 具體實作

本方法中,需要定義一些新的函數來周遊輸入塊隊列并阻塞至整個處理過程完成。

需要一個函數将輸入序列中一個元素取出并将引用指向序列剩餘部分。

《Clojure資料分析秘笈》——3.5節将agent和STM結合使用
《Clojure資料分析秘笈》——3.5節将agent和STM結合使用

3.5.3 實作原理

get-chunk函數是stm幫助維護狀态一緻性的示例。由于它們在相同的dosync塊中,通路資料得到其第一個元素并将引用指向序列的剩餘部分是一個原子操作。不必擔心由于程序的原因資料被處理兩次或者被遺漏。調用get-chunk的函數也不用擔心此類事情。将複雜的部分隐藏起來極大簡化了複雜系統。

繼續閱讀