Clojure:IO的future,agent或core.async

fev*_*nym 4 concurrency clojure

假设有4个组成部分:

  1. 通过http进行交互式数据收集(调查
  2. 原子,积累了调查阶段
  3. 大量计算
  4. 数据库作者

我尽量做到最后两个操作是asyncronous,像放置在队列中积累的数据的地方,并开始收集等调查,同时事情处理数据和别的东西做IO与任何先前准备的数据。

问题是使用语言的什么功能?在《Clojure编程》一书中,有使用代理作为执行IO操作的组件的示例,但是期货不提供相同的“即发即弃”功能吗?还是代理仍然是原子或引用之类的身份,而根本不是演员?

Jos*_*osh 5

代理是可变状态的容器,就像原子和引用一样。您将一个动作发送给一个“即发即弃”的代理,并保证发送给该代理的每个动作将仅执行一次(与swap!对原子ped上的函数和alter!ref的s不同,后者可以重试多次)可能)。发送到代理的多个操作将依次而不是同时完成。

因此,可以在发送给代理的动作中安全地执行I / O。因此,代理程序可能是第4步的理想选择,因为您希望每个数据库写入仅发生一次(永远不要重试)。

您将只有一个代理,代表您的数据库状态。在步骤3中创建的每个Future /线程中,在执行计算之后,您会将操作发送到单独的代理,该代理将对这些操作进行序列化,即使这些操作是从线程同时到达的也是如此。