Clojure中的commute和alter有什么区别?

3

我想编写一段非常简单的代码,展示Clojure中commute和alter之间的不同结果。有人能为此创建一个例子吗?

更简单易懂是理解差异的最好方式。


1
我不认为这是离题的。它在寻求一个例子,但也可以表述为“commute和alter之间有什么区别?有人能展示一个函数来演示它们的不同行为吗?” - amalloy
1
我同意这是一个有效的问题,且不明显重复。因为它们总是产生相同的答案,只是有时候需要不同的时间,所以没有简单的答案。 - Arthur Ulfeldt
1个回答

1
假设 commute 被正确使用,Refs 的观察值不应有任何差异,除非在高争用的情况下使用 commute 可能有助于事务提交,而使用 alter 则难以实现。当然,在这种情况下,结果会有相当大的差异...
更容易说明事物如何有所不同是通过副作用。以下是一个单线程示例,以说明基本属性:
- 每个“事务尝试”将精确调用一次 alter(可能仅一次)。 - 每个“事务尝试”将精确调用一次 commute (虽然 commute 不会导致它们,但如果在同一 dosync 块中使用 alter,则可能涉及重试),然后最后一次计算已提交的值(因此至少两次,尽管再次强调,它不会自行导致重试)。
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil

使用一些 Thread/sleep 和一些线程,可以在仍然观察到 commute 两次重试的情况下,在 alter 方面引起更多的重试,研究使用其中一个或另一个的影响等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接