本节书摘来自华章社区《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 具体实现
本方法中,需要定义一些新的函数来遍历输入块队列并阻塞至整个处理过程完成。

  1. 需要一个函数将输入序列中一个元素取出并将引用指向序列剩余部分。


《Clojure数据分析秘笈》——3.5节将agent和STM结合使用


《Clojure数据分析秘笈》——3.5节将agent和STM结合使用

3.5.3 实现原理
get-chunk函数是STM帮助维护状态一致性的示例。由于它们在相同的dosync块中,访问数据得到其第一个元素并将引用指向序列的剩余部分是一个原子操作。不必担心由于进程的原因数据被处理两次或者被遗漏。调用get-chunk的函数也不用担心此类事情。将复杂的部分隐藏起来极大简化了复杂系统。

相关文章:

  • 2022-01-16
  • 2021-12-12
  • 2021-10-15
  • 2022-01-14
  • 2021-10-18
  • 2021-06-10
  • 2021-09-17
  • 2021-04-16
猜你喜欢
  • 2021-11-10
  • 2021-05-04
  • 2021-05-09
  • 2022-01-07
  • 2021-12-26
  • 2021-06-24
  • 2021-06-19
相关资源
相似解决方案