Clojure,原子和参考

时间:2014-02-20 08:40:18

标签: multithreading clojure

在阅读clojure programming后,我对refs和atom以及clojure引用类型有一些疑问,而且大多数问题与本书有关。

首先

这些书谈到了协调,它说“协调运作是指多个参与者必须合作以产生正确结果的运作。”这是否意味着如果我有3个fn1fn2fn3,并且它们中的每一个都会执行一些可能会更改引用状态的操作(假设它发生在每个自己的{ {1}}),它在链式操作中以同步方式发生?类似于Thread的输出是fn1的输入,依此类推。

第二

我无法理解fn2refs之间的区别。该书说atoms用于协调同步,refs用于不协调同步。它们中的每一个(atomsrefs)都有自己的示例,其中atoms以多种函数(1个原子2函数)和多个{操作}的方式使用{1}}有1个功能。这本书没有给出一个例子,说明为什么我们不应该或不能这样做。

2 个答案:

答案 0 :(得分:3)

  • Atoms允许多个线程将转换应用于单个值,并保证转换是原子的。 swap!获取原子和期望原子当前值的函数。使用当前值调用该函数的结果存储在atom中。对swap!的多次调用可能会交错,但每次调用都将独立运行。
  • Refs允许多个线程以协调的方式更新多个值。 sync内所有引用的所有更新都将完成,或者不会。您必须编写代码,以便满足事务重试。有一些潜在的性能调整,如果你可以放松操作的顺序,这可能会减少事务重试的机会(但不保证)。

答案 1 :(得分:2)

差异非常简单。

refs在一个事务下运行(类似于数据库事务)。想象一下银行系统。您可以将帐户表示为参考 为了转账,你开始一个Clojure STM交易--via(dosync) - 。从 ref-1 中减去X金额,并将该金额添加到帐户 ref-2 。 如果出现问题,那么Clojure STM将重新启动操作 想象一下,没有交易。您从 ref-1 中减去了X金额,然后在将该金额添加到 ref-2 之前,您的系统出现了问题。您的客户根本不会感到高兴(如果您没有被起诉)。

Clojure STM实现为MVCC

另一方面,原子不需要进行交易就可以进行操作。没有协调时,原子很方便。例如,一个计数器可以增加Web分析系统中访问页面的总数。

看看Clojure Refs。它提供了大量有价值的信息。