【问题标题】:Clojure: future, agent or core.async for IOClojure:用于 IO 的 future、agent 或 core.async
【发布时间】:2018-01-19 01:44:10
【问题描述】:

假设有 4 个组件:

  1. 通过 http 进行交互式数据收集(survey
  2. atom,累积调查阶段
  3. CPU 繁重的计算
  4. 数据库编写器

我尝试使最后两个操作异步,例如将累积的数据放在队列中的某个位置并开始收集其他调查,而 something 处理数据,something else 执行 IO与任何先前准备的数据。

问题是要使用语言的什么特性?在 Clojure Programming 书中有使用 agents 作为组件来执行 IO 操作的示例,但是期货不提供相同的“即发即弃”设施吗?还是 agent 仍然是 atom 或 ref 之类的身份,而根本不是 actor?

【问题讨论】:

    标签: concurrency clojure


    【解决方案1】:

    代理是可变状态的容器,就像原子和引用一样。您向代理发送一个操作,即“即发即弃”,并保证发送给该代理的每个操作只执行一次(与原子上的函数swap!ped 不同,并且alter!s 用于 refs,可能会重试多次)。发送到代理的多个操作将连续完成,而不是同时完成。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      相关资源
      最近更新 更多