假设有4个组件:
我尝试将最后两个操作设置为异步,例如将累积的数据放在队列中的某个位置并开始收集其他调查,而某些事情处理数据和其他事情执行IO以前准备的任何数据。
问题是使用什么语言功能?在 Clojure Programming 一书中,有一些使用代理作为组件来执行IO操作的例子,但是期货不提供相同的“即发即忘”设施吗?或者代理仍然是像atom或ref这样的身份,而不是演员?
答案 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中创建的每个未来/线程中,在执行计算后,将操作发送给单独的代理,即使它们从您的线程同时到达,也会序列化操作。