参考文献之间的Clojure差异,VAR,代理,原子,结合实例参考文献之间的Clojure差异,VA

2019-05-12 20:50发布

我很新的Clojure的,你们可以给我一份有真实世界场景的解释。 我的意思是,在使用参考,无功,代理,原子。 我读的书,但是,仍然无法理解的现实世界的例子。

Answer 1:

我强烈推荐“的Clojure的喜悦”或“编程Clojure的”一个真正的回答这个问题,我可以重现短剪断,它的动机是每个:

通过观看开始对身份的概念,这个视频和/或在这里学习 。

  • 参考文献都是协调同步获得“众多的身份”。
  • 原子是一个单一的身份不协调的同步访问。
  • 代理是不协调的异步访问一个身份。
  • 瓦尔是用于与共享默认值线程局部孤立的身份 。

协作式接入时使用两个个人信息需要改变在一起,典型的例子是从一个银行账户移动到另一个的钱,它需要上移完全或者根本没有。

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

当呼叫预计要等到所有的身份在继续之前解决使用同步访问。

异步访问是“射后不理”,让身份在自己的时间达到其新的状态。



Answer 2:

参考文献是对于需要线程之间同步状态。 如果您需要跟踪一堆不同的东西,你会有时候需要做一次写几个的事情时,请使用裁判。 任何时候,你必须多条不同的状态,利用裁判是不是一个坏主意。

原子是为需要线程之间同步独立状态。 如果你将永远不会需要改变原子和任何在同一时间其他人的状态,利用在原子是安全(特别是,如果在整个程序中只有一条状态的,你可以把它放在一个原子) 。 作为一个非简单的例子,如果你想缓存函数的返回值(即memoize的话),使用原子可能是安全的 - 状态是不可见的功能之外的一切,所以你不必担心关于函数的东西搞乱了内部的状态变化。

代理商主要的一点是,他们在不同的线程中运行。 你可以得到代理的价值,并告诉它的功能应用到它的价值,但你不知道什么时候该功能将运行或者什么值的函数将被应用到。

瓦尔是当你需要存储在每个线程的基础的东西。 如果你有一个多线程的程序和每一个线程需要自己的私有状态,把该州的变种。

至于现实世界的例子去,如果你提供你正在尝试做一个例子,我们可以告诉你使用什么。



Answer 3:

当我第一次读到这些类型的,我也努力去理解,我可以或应该使用每个所以这里是我的简单的英语回答:

使用VAR时数据不会改变。 出现这种情况,只要您使用def与启动或大部分功能defdefn

当你有改变单个项目使用的原子。 一个例子可能是一个计数器或要项添加到载体。

当你有两个或更多的东西必须同时改变使用REF。 认为“数据库事务”,如果你是熟悉的。 这个典型的例子是从一个账户转移资金到另一个。 每个帐户可以被存储在一个裁判,这样的变化可以使其出现原子。

当你想要的东西改变使用代理,但你不在乎的时候。 这可能是一个很长的计算或写东西到一个文件或插座。 需要注意的是后者,你应该使用send-off

注:我很欣赏,有不少更以每一种,但希望这应该给你一个起点。



Answer 4:

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

分享状态-当使用乏,原子,代理商和裁判?

我希望这将有助于人们寻找的是主题中的答案。

从@tunaci建议后的文章的一些快捷方式:

瓦尔是全球每一个线程。

不要更改瓦尔创建后。 这在技术上是可行的,但它的原因有很多坏主意。

原子

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

不要使用非幂等长的时间执行功能和功能

代理

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

参考文献

裁判的工作原理类似于数据库事务。 写和读的保护dosync。 您可以在很多裁判在交易安全运行。

和流程当使用其中之一:

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

它是复杂的,长期的主题,充分回答没有复制和过去的文章,所以请原谅我将你重定向到网站:)



Answer 5:

原子,参考文献和代理-一些照明这里http://blog.jayfields.com/2011/04/clojure-state-management.html



文章来源: Clojure differences between Ref, Var, Agent, Atom, with examples