Clojure:IO

时间:2017-08-10 17:24:13

标签: concurrency clojure

假设有4个组件:

  1. 通过http(调查
  2. 进行交互式数据收集
  3. atom ,累积调查阶段
  4. cpu-heavy computation
  5. 数据库编写者
  6. 我尝试将最后两个操作设置为异步,例如将累积的数据放在队列中的某个位置并开始收集其他调查,而某些事情处理数据和其他事情执行IO以前准备的任何数据。

    问题是使用什么语言功能?在 Clojure Programming 一书中,有一些使用代理作为组件来执行IO操作的例子,但是期货不提供相同的“即发即忘”设施吗?或者代理仍然是像atom或ref这样的身份,而不是演员?

1 个答案:

答案 0 :(得分:4)

代理是可变状态的容器,就像原子和引用一样。您向代理发送一个“火上浇油”的动作,保证发送给该代理的每个动作只执行一次(与原子上<script type="application/json" id="stuff"> { "unicorns": "awesome", "abc": [1, 2, 3], "badentry": "blah </script><div id='baddiv'>I should not exist.</div><script type="application/json" id='stuff'> ", } </script> ped不同和swap! s for refs,可以多次重试)。发送给代理的多个操作将按顺序完成,而不是同时完成。

因此,可以在发送给代理的动作中安全地执行I / O.因此,代理可能是您的步骤#4的良好候选者,因为您希望每个数据库写入仅发生一次(从不重试)。

您将拥有一个代理,代表您的数据库状态。在步骤#3中创建的每个未来/线程中,在执行计算后,将操作发送给单独的代理,即使它们从您的线程同时到达,也会序列化操作。