Ref,Var,Agent,Atom与范例之间的Clojure区别

我对Clojure很陌生,你们可以给我解释真实的世界情景。 我的意思是,在哪里使用Ref,Var,Agent,Atom。 我读书,但是,仍然不能理解现实世界的例子。

我强烈推荐“Clojure的快乐”或者“编程Clojure”来真正的回答这个问题,我可以重现一个简短的片段 – 它的动机:

首先观看这个video关于身份和/或在这里学习 的概念 。

  • Refs是协调同步访问“许多身份”。
  • primefaces是用于对一个身份进行不协调的同步访问。
  • 代理用于对单个标识进行不协调的asynchronous访问。
  • variables是用于共享默认值的线程本地独立身份

当两个身份需要一起改变时,使用协调访问,典型的例子是从一个银行账户转移到另一个银行账户,它需要完全移动或根本不移动。

只有一个身份需要更新时使用不协调的访问,这是一个非常常见的情况。

同步访问是电话在等待所有身份解决之前等待的地方。

asynchronous访问是“消失而忘记”,让身份在自己的时间内达到新的状态。

引用是需要在线程之间同步的状态。 如果你需要跟踪一堆不同的东西,你有时候需要做一些写入一些事情的操作,请使用refs。 任何时候你有多个不同的状态,使用refs不是一个坏主意。

primefaces是独立的状态,需要在线程之间进行同步。 如果你永远不需要改变primefaces的状态和其他的东西,那么使用primefaces就是安全的(特别是如果整个程序只有一个状态,你可以把它放在一个primefaces中) 。 作为一个非平凡的例子,如果你试图caching一个函数的返回值(例如记忆它),使用一个primefaces可能是安全的 – 这个状态对函数外面的所有东西是不可见的,所以你不必担心关于函数里面的状态变化搞乱了什么。

代理的主要观点是他们运行在不同的线程中。 您可以获取代理的价值,并告诉它将函数应用于其值,但是您不知道函数何时运行或函数将应用于什么值。

当你需要在每个线程的基础上存储一些东西的时候,这个variables是可以使用的。 如果你有一个multithreading的程序,并且每个线程都需要它自己的私有状态,那么把这个状态放在一个variables中。

就现实世界中的例子而言,如果您提供了您正在尝试做的事例,那么我们可以告诉您要使用什么。

当我第一次读到这些types的时候,我也努力去理解我可以或者应该使用每一种types,所以这里是我简单的英语答案:

数据不会更改时使用var。 每当你使用def或大多数以defn开头的函数时,就会发生这种情况。

当你有一个单一的项目更改时使用一个primefaces。 一个例子可能是你想添加项目的计数器或向量。

当有两件或更多东西必须同时更换时,请使用参考。 如果你熟悉的话,可以考虑“数据库事务”。 这个典型的例子就是把钱从一个账户转移到另一个账户。 每个帐户都可以存储在ref中,以便可以使更改显示为primefaces。

当你想要改变一些东西的时候使用一个代理,但是你什么都不在乎。 这可能是一个很长的计算或写入文件或套接字。 请注意,对于后者,您应该使用send-off

注:我明白,每一个都有很多,但希望这能给你一个出发点。

我写了文章总结了它们之间的区别,并帮助select何时使用哪一个。

共享状态 – 何时使用variables,primefaces,代理和参考?

我希望这会帮助那些在这个话题上寻找答案的人。

@tunacibuild议之后的一些文章快捷方式:

瓦尔

variables是每个线程的全局。

创build后不要更改variables。 这在技术上是可行的,但是由于许多原因,这是一个坏主意。

primefaces

为每个线程共享访问可变状态。 更改同步发生。 其他线程在运行期间改变状态时重试。

不要长时间执行不使用幂等函数和函数

代理

为每个线程共享访问可变状态。 更改asynchronous发生。

参考文献

参考文献与数据库交易类似。 写和读都是在dosync中保护的。 您可以在交易中安全地操作多个参考。

以及使用哪一个stream程图时: 流程图

请看网站上的图片,因为一些更新总是可能的。

这是一个复杂的,长期的话题,没有复制和过去的文章给予完整的答案,所以请原谅我我redirect到网站:)

primefaces,参考和代理 – 这里的一些照明http://blog.jayfields.com/2011/04/clojure-state-management.html